Python3 --- Django创建模型

一、Model的作用

在Django的框架设计中采用了MVT模型,即Model,Viewer,Template


Model相对于MVC框架来说就相当对数据处理层,它主要负责与数据的交互,在使用Django框架设计应用系统时,需要注意的是Django默认采用的是ORM框架中的codefirst模型,即面向对象的开发方式(如Hibernate),也就是说开发人员只需要专注于代码的编写,而不需要过多的关注数据库层面的东西,把开发人员从数据库中解放出来


Django会根据Model类生成一个数据库镜像文件,然后再使用该镜像文件生成数据库,同时该文件将记录与数据库同步版本的变化,所以在使用Django进行开发时不要手工去修改数据库,这样会造成Django框架的版本记录不正确,从而无法正确的同步数据模型与数据库的内容


二、Model的创建

创建项目完成后,会生成settings.py文件,用于配置项目相关信息,此处可以修改数据库配置,本例使用mysql数据库

创建应用完成后,会生成models.py文件,此处用于创建Model,如下:

from django.db import models

# 定义模型
class BookInfo(models.Model):
    btitle = models.CharField(max_length=20)
    bput_date = models.DateTimeField(db_column='pub_date')
    bread = models.IntegerField(default=0)
    bcommet = models.IntegerField(null=False)
    isDelete = models.BooleanField(default=False)

# 定义模型
class HeroInfo(models.Model):
    hname = models.CharField(max_length=10)
    hgender = models.BooleanField(default=True)
    hcontent = models.CharField(max_length=1000)
    isDelete = models.BooleanField(default=False)
    hBook = models.ForeignKey(BookInfo, on_delete=models.CASCADE)


2.1、Model字段类型

字段类型被定义在django.db.models.fields目录下,字段类型包含如下:

  • AutoField:一个根据实际ID自动增长的IntegerField,通常不指定,如果不指定,一个主键字段将自动添加到模型中
  • BooleanField:true/false 字段,此字段的默认表单控制是CheckboxInput
  • NullBooleanField:支持null、true、false三种值
  • CharField(max_length=字符长度):字符串,默认的表单样式是 TextInput
  • TextField:大文本字段,一般超过4000使用,默认的表单控件是Textarea
  • IntegerField:整数
  • FloatField:用Python的float实例来表示的浮点数
  • TimeField:使用Python的datetime.time实例表示的时间,参数同DateField
  • DateTimeField:使用Python的datetime.datetime实例表示的日期和时间,参数同DateField
  • FileField:一个上传文件的字段
  • ImageField:继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image
  • DecimalField(max_digits=None, decimal_places=None):使用python的Decimal实例表示的十进制浮点数
    • DecimalField.max_digits:位数总数
    • DecimalField.decimal_places:小数点后的数字位数
  • DateField[auto_now=False, auto_now_add=False]):使用Python的datetime.date实例表示的日期
    • 参数DateField.auto_now:每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false
    • 参数DateField.auto_now_add:当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false
    • 该字段默认对应的表单控件是一个TextInput. 在管理员站点添加了一个JavaScript写的日历控件,和一个“Today"的快捷按钮,包含了一个额外的invalid_date错误消息键
    • auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果


2.2、字段参数

通过字段参数,可以实现对字段的约束

  • null:如果为True,Django 将空值以NULL 存储到数据库中,默认值是 False
  • blank:如果为True,则该字段允许为空白,默认值是 False,对比:null是数据库范畴的概念,blank是表单验证证范畴的
  • db_column:字段的名称,如果未指定,则使用属性的名称
  • db_index:若值为 True, 则在表中会为此字段创建索引
  • default:默认值
  • primary_key:若为 True, 则该字段会成为模型的主键字段
  • unique:如果为 True, 这个字段在表中必须有唯一值


2.3、表级关系

如Hibernate,表级关系如下:

  • ForeignKey:一对多,将字段定义在多的端中
  • ManyToManyField:多对多,将字段定义在两端中
  • OneToOneField:一对一,将字段定义在任意一端中


2.4、元选项

Django模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性。代码如下:

# 定义模型
class BookInfo(models.Model):
    btitle = models.CharField(max_length=20)
    bput_date = models.DateTimeField(db_column='pub_date')
    bread = models.IntegerField(default=0)
    bcommet = models.IntegerField(null=False)
    isDelete = models.BooleanField(default=False)

    class Meta:
        db_table = 'bookinfo',
        verbose_name = '图书信息'
元选项的配置详解请参阅: Python3 --- Django元选项详解


2.5、管理器

管理器是Django的模型进行数据库的查询操作的接口,Django应用的每个模型都拥有至少一个管理器,Django提供了默认的管理器是models.Manager,我们通过继承的方式自定义管理器,如下:

# 自定义管理器
class BookInfoManager(models.Manager):
    def get_queryset(self):
        return super(BookInfoManager,self).get_queryset().filter(isDelete=False)

    def create(self,btitle,bput_date):
        b = BookInfo()
        b.btitle = btitle
        b.bput_date = bput_date
        b.bread = 0
        b.bcommet = False
        b.isDelete = False
        return b

# 定义模型
class BookInfo(models.Model):
    btitle = models.CharField(max_length=20)
    bput_date = models.DateTimeField(db_column='pub_date')
    bread = models.IntegerField(default=0)
    bcommet = models.IntegerField(null=False)
    isDelete = models.BooleanField(default=False)

    class Meta:
        db_table = 'bookinfo',
        verbose_name = '图书信息'


    books1 = models.Manager()
    books2 = BookInfoManager()

    @classmethod
    def create(self, btitle, bput_date):
        b = BookInfo()
        b.btitle = btitle
        b.bput_date = bput_date
        b.bread = 0
        b.bcommet = False
        b.isDelete = False
        return b

通常产生对manager的自定义的需求来自于两点:

  • 需要扩展或者修改Django的manager方法。
  • 需要修改返回的QuerySet。


三、生成迁移文件

迁移文件的概念如Hibernate的映射文件,用于指定模型类与数据库之间的映射关系,生成迁移文件命令如下:

python manage.py makemigrations

迁移文件被生成到应用的migrations目录,如下是migrations目录中内容:

Python3 --- Django创建模型_第1张图片

迁移文件生成时,会生成0001_initial.py文件,后续文件为修改的日志记录文件,0001_initial.py迁移文件内容如下:

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='BookInfo',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('btitle', models.CharField(max_length=20)),
                ('bput_date', models.DateTimeField(db_column='pub_date')),
                ('bread', models.IntegerField(default=0)),
                ('bcommet', models.IntegerField()),
                ('isDelete', models.BooleanField(default=False)),
            ],
            options={
                'db_table': 'bookinfo',
            },
        ),
        migrations.CreateModel(
            name='HeroInfo',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('hname', models.CharField(max_length=10)),
                ('hgender', models.BooleanField(default=True)),
                ('hcontent', models.CharField(max_length=1000)),
                ('isDelete', models.BooleanField(default=False)),
                ('hBook', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='booktest.BookInfo')),
            ],
            options={
                'db_table': 'heroinfo',
            },
        ),
    ]
注意:使用Django进行开发时不要手工去修改数据库,这样会造成Django框架的版本记录不正确,从而无法正确的同步数据模型与数据库的内容


四、执行迁移文件

执行迁移文件,即通过迁移文件生成对应的数据库表信息,如下:

python manage.py migrate


你可能感兴趣的:(Python3,------,Django)