ORM常用字段和参数以及关系字段,ORM手动创建第三张表(增删改查)
orm常用字段与非常用字段
常用字段
AutoField() # int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。 IntegerField() # 一个整数类型,范围在 -2147483648 to 2147483647。 CharField() # 字符类型,必须提供max_length参数, max_length表示字符长度。 DateField() # 日期字段,日期格式 YYYY-MM-DD DateTimeField() # 日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例
DecimalField()
# 价格字段,max_digits=5,decimal_places=2,整数与小树总长度5,保留两位小数
EmailField()
# 邮件字段
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
AutoField(Field) # int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) # bigint自增列,必须填入参数 primary_key=True #:当model中如果没有自增列,则自动会创建一个列名为id的列 from django.db import models class UserInfo(models.Model): # 自动创建一个列名为id的且为自增的整数列 username = models.CharField(max_length=32) class Group(models.Model): # 自定义自增列 nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) SmallIntegerField(IntegerField): # 小整数 -32768 ~ 32767 PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) # 正小整数 0 ~ 32767 IntegerField(Field) # 整数列(有符号的) -2147483648 ~ 2147483647 PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) # 正整数 0 ~ 2147483647 BigIntegerField(IntegerField): # 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807 BooleanField(Field) # 布尔值类型 NullBooleanField(Field): # 可以为空的布尔值 CharField(Field) # 字符类型 # 必须提供max_length参数, max_length表示字符长度 TextField(Field) # 文本类型 EmailField(CharField): # 字符串类型,Django Admin以及ModelForm中提供验证机制 IPAddressField(Field) # 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制 GenericIPAddressField(Field) # 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6 # 参数: protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6" unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both" URLField(CharField) # 字符串类型,Django Admin以及ModelForm中提供验证 URL SlugField(CharField) # 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号) CommaSeparatedIntegerField(CharField) # 字符串类型,格式必须为逗号分割的数字 UUIDField(Field) # 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证 FilePathField(Field) # 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能 # 参数: # path, 文件夹路径 # match=None, 正则匹配 # recursive=False, 递归下面的文件夹 # allow_files=True, 允许文件 # allow_folders=False, 允许文件夹 FileField(Field) # 字符串,路径保存在数据库,文件上传到指定目录 # 参数: # upload_to = "" 上传文件的保存路径 # storage = None 存储组件,默认django.core.files.storage.FileSystemStorage ImageField(FileField) # 字符串,路径保存在数据库,文件上传到指定目录 # 参数: # upload_to = "" 上传文件的保存路径 # storage = None 存储组件,默认django.core.files.storage.FileSystemStorage # width_field=None, 上传图片的宽度保存的数据库字段名(字符串) # height_field=None 上传图片的高度保存的数据库字段名(字符串) DateTimeField(DateField) # 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] DateField(DateTimeCheckMixin, Field) # 日期格式 YYYY-MM-DD TimeField(DateTimeCheckMixin, Field) # 时间格式 HH:MM[:ss[.uuuuuu]] DurationField(Field) # 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型 FloatField(Field) # 浮点型 DecimalField(Field) # 10进制小数 # 参数: max_digits,小数总长度 decimal_places,小数位长度 BinaryField(Field) # 二进制类型
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 对应关系: 'AutoField': 'integer AUTO_INCREMENT', 'BigAutoField': 'bigint AUTO_INCREMENT', 'BinaryField': 'longblob', 'BooleanField': 'bool', 'CharField': 'varchar(%(max_length)s)', 'CommaSeparatedIntegerField': 'varchar(%(max_length)s)', 'DateField': 'date', 'DateTimeField': 'datetime', 'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)', 'DurationField': 'bigint', 'FileField': 'varchar(%(max_length)s)', 'FilePathField': 'varchar(%(max_length)s)', 'FloatField': 'double precision', 'IntegerField': 'integer', 'BigIntegerField': 'bigint', 'IPAddressField': 'char(15)', 'GenericIPAddressField': 'char(39)', 'NullBooleanField': 'bool', 'OneToOneField': 'integer', 'PositiveIntegerField': 'integer UNSIGNED', 'PositiveSmallIntegerField': 'smallint UNSIGNED', 'SlugField': 'varchar(%(max_length)s)', 'SmallIntegerField': 'smallint', 'TextField': 'longtext', 'TimeField': 'time', 'UUIDField': 'char(32)',
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class User(model.Model) id = models.AutoField(primary_key=True) name = models.CharField(max_length=32) email = models.EmailField() price = models.DecimalField(max_digits=5,decimal_places=2) commit_num = models.IntegerField(default=0) authordatil = models.OneToOneField(to_field='id',to='Authordatil') publish = models.ForeignKey(to='Publish',to_field='id') authors = models.ManyToManyField(to='Author')
orm字段参数
null # 表示某个字段可以设置为空 unique # 唯一性约束 db_index # 设置索引 default # 为某个字段默认添加值 DateField 与 DateTimeField # 日期字段 # auto_now_add = True 创建记录时候自动把当前时间添加到数据库 # auto_now = True 每次更新数据时自动更新该字段
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
null 数据库中字段是否可以为空 db_column 数据库中字段的列名 db_tablespace default 数据库中字段的默认值 primary_key 数据库中字段是否为主键 db_index 数据库中字段是否可以建立索引 unique 数据库中字段是否可以建立唯一索引 unique_for_date 数据库中字段【日期】部分是否可以建立唯一索引 unique_for_month 数据库中字段【月】部分是否可以建立唯一索引 unique_for_year 数据库中字段【年】部分是否可以建立唯一索引 verbose_name Admin中显示的字段名称 blank Admin中是否允许用户输入为空 editable Admin中是否可以编辑 help_text Admin中该字段的提示信息 choices Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作 如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1) error_messages 自定义错误信息(字典类型),从而定制想要显示的错误信息; 字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date 如:{'null': "不能为空.", 'invalid': '格式错误'} validators 自定义错误验证(列表类型),从而定制想要的验证规则 from django.core.validators import RegexValidator from django.core.validators import EmailValidator,URLValidator,DecimalValidator,\ MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator 如: test = models.CharField( max_length=32, error_messages={ 'c1': '优先错信息1', 'c2': '优先错信息2', 'c3': '优先错信息3', }, validators=[ RegexValidator(regex='root_\d+', message='错误了', code='c1'), RegexValidator(regex='root_112233\d+', message='又错误了', code='c2'), EmailValidator(message='又错误了', code='c3'), ] )
orm关系字段
# ForeignKey():外键字段 models.ForeignKey( to="Book",to_field="id", null=True, on_delete=models.SET_NULL, db_constraint=False ) # 字段参数 # 字段属性to关联的表 # 字段属性to_field关联的表字段,省略默认关联主键 # 字段属性on_delete (外键关联数据被删除时的操作) # models.CASCADE 级联删除 # modles.PROTECT 抛出异常 # models.SET_NULL 设置空值 # models.SET_DEFAULT 设置默认值 # models.SET(value)自定义值 # 字段属性related_name自定义反向查询的字段名 # 字段属性db_constraint=False取消关联关系,但还可以使用连表查询 总结:models.ForeignKey(to='关联的类名', null=True, on_delete=models.SET_NULL, db_constraint=False, related_name="本类名小写") # OneToOneField():一对一外键字段 models.ForeignKey( to="Book",to_field="id",null=True,on_delete=models.SET_NULL,db_constraint=False ) # 字段参数 # 字段属性to关联的表 # 字段属性to_field关联的表字段,省略默认关联主键 # 字段属性on_delete (外键关联数据被删除时的操作) # models.CASCADE 级联删除 # modles.PROTECT 抛出异常 # models.SET_NULL 设置空值 # models.SET_DEFAULT 设置默认值 # models.SET(value)自定义值 # 字段属性related_name自定义反向查询的字段名 # 字段属性db_constraint=False取消关联关系,但还可以使用连表查询 总结:models.OneToOneField(to='关联的类名', null=True, on_delete=models.SET_NULL, db_constraint=False, related_name="本类名小写") # ManyToManyField():多对多关系字段 models.ManyToManyField(to="Author",) # 字段属性to关联的表 # 字段属性through关联关系类 # 字段属性through_fields关联关系表中(本身类名小写字段, 关联表类名小写字段) 总结: models.ManyToManyField(to="Author") # 自关联关系 # 仅用于多对多自关联时,指定内部是否创建反向操作的字段。默认为True。 # 举个例子: class Person(models.Model): name = models.CharField(max_length=16) friends = models.ManyToManyField(to="self") # 自关联
orm手撸第三张关系表(推荐使用第三种方法)
# 自动创建第三张表,取消关联 class Book(models.Model): # 自动创建第三张表 author = models.ManyToManyField(to='Author',db_constraint=False) # 取消作者与书这两张表的关联,但依然支持ORM连表查询 class Meta: # 建立联合唯一 unique_together = ("author", "book") # 手动创建第三张表(好处是可以自己添加字段,只支持delete,update,create) class Book(models.Model): name = models.CharField(max_length=64) class Book(models.Model): name = models.CharField(max_length=64) class Book_Author(models.Model): # 分别通过外键关联书和作者,第三张表 book = models.ForeignKey( to="Book", null=True, on_delete=models.SET_NULL, db_constraint=False ) author = models.ForeignKey( to='Author', null=True, on_delete=models.SET_NULL, db_constraint=False ) time = models.DateField() class Meta: # 建立联合唯一 unique_together = ("author", "book") 查询的时候每次要通过第三张关联表去查 eg:查询lxx写的书 Book.objects.filter(Book_Author__name="lxx").values("name") # 设置ManyToManyField字段指定自己创建的第三张表,不支持add remove clear set,但跟自动生成第三张表一样可以ORM对象去查 class Book(models.Model): # 必须告诉是通过第三张表 参数决定了正向还是反向 author = models.ManyToManyField(to='Author',through="Book_Author",through_fields=('book', 'author') ) # 手动创建第三张表,必须通过第三张表,所以书与作者本身就没有关联 class Book_Author(models.Model): # 第三张表 book = models.ForeignKey( to="Book", null=True, on_delete=models.SET_NULL, db_constraint=False ) author = models.ForeignKey( to='Author', null=True, on_delete=models.SET_NULL, db_constraint=False ) time = models.DateField() class Meta: # 建立联合唯一 unique_together = ("author", "book")
增:Book_Author.objects.create(book_id=1,author_id=1)
删:Book_Author.filter(id=1).delete()
改:Book_Author.filter(id=1).update(book_id=2,author_id=5)
查:Book.objects.filter(name="lxx").values("author__name") # 通过ORM对象去查
查:Book.objects.filter(name="lxx").values("book_author__author__name") # 通过第三张表去查