django模型动态修改参数,增加 filter 字段的方式
我就废话不多说啦,还是直接看代码吧!
kwargs={ #动态查询的字段 } #选择deleted_datetime为空的记录 ifexclude_deleted: kwargs['deleted_datetime__isnull']=True #选择特的category ifcategoryisnotNone: kwargs['category']=category #特定的用户 ifcurrent_user_only: kwargs['user']=current_user #根据标题查询 iftitle_search_query!='': kwargs['title__icontains']=title_search_query #应用所有的查询 entries=Entry.objects.filter(**kwargs) #打印出所有的结果检查 printentries
用这种方式,在Qobject方式下,是有问题的,要采用如下方式:
kwargs={'deleted_datetime__isnull':True} args=(Q(title__icontains='Foo')|Q(title__icontains='Bar')) entries=Entry.objects.filter(args,**kwargs)
补充知识:Django模型系统的常用字段和字段参数
常用字段
AutoField:int自增列,必须填入参数primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。
IntegerField:一个整数类型,范围在-2147483648to2147483647。
CharField:字符类型,必须提供max_length参数,max_length表示字符长度
DateField:日期字段,日期格式YYYY-MM-DD,相当于Python中的datetime.date()实例。
DateTimeField:日期时间字段,格式YYYY-MM-DDHH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。
所有字段合集
AutoField(Field) -int自增列,必须填入参数primary_key=True BigAutoField(AutoField) -bigint自增列,必须填入参数primary_key=True 注:当model中如果没有自增列,则自动会创建一个列名为id的列 fromdjango.dbimportmodels classUserInfo(models.Model): #自动创建一个列名为id的且为自增的整数列 username=models.CharField(max_length=32) classGroup(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): -字符串类型,DjangoAdmin以及ModelForm中提供验证机制 IPAddressField(Field) -字符串类型,DjangoAdmin以及ModelForm中提供验证IPV4机制 GenericIPAddressField(Field) -字符串类型,DjangoAdmin以及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) -字符串类型,DjangoAdmin以及ModelForm中提供验证URL SlugField(CharField) -字符串类型,DjangoAdmin以及ModelForm中提供验证支持字母、数字、下划线、连接符(减号) CommaSeparatedIntegerField(CharField) -字符串类型,格式必须为逗号分割的数字 UUIDField(Field) -字符串类型,DjangoAdmin以及ModelForm中提供对UUID格式的验证 FilePathField(Field) -字符串,DjangoAdmin以及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-DDHH: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) -二进制类型
ORM字段与数据库实际字段的对应关系
对应关系: 'AutoField':'integerAUTO_INCREMENT', 'BigAutoField':'bigintAUTO_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':'doubleprecision', 'IntegerField':'integer', 'BigIntegerField':'bigint', 'IPAddressField':'char(15)', 'GenericIPAddressField':'char(39)', 'NullBooleanField':'bool', 'OneToOneField':'integer', 'PositiveIntegerField':'integerUNSIGNED', 'PositiveSmallIntegerField':'smallintUNSIGNED', 'SlugField':'varchar(%(max_length)s)', 'SmallIntegerField':'smallint', 'TextField':'longtext', 'TimeField':'time', 'UUIDField':'char(32)',
字段参数
null:用于表示某个字段可以为空
unique:如果设置为unique=True则该字段在此表中必须是唯一的。
db_index:如果db_index=True则代表着为此字段设置数据库索引。
default:为该字段设置默认值。
db_column:设置该属性在数据库表中所对应的字段名
DatetimeField、DateField、TimeField这个三个时间字段,都可以设置如下属性。
auto_now_add:配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
auto_now:配置上auto_now=True,每次更新数据记录的时候会更新该字段。
其它属性详情请查看:官方文档
关系字段
ForeignKey
外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在'一对多'中'多'的一方。ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系。
字段参数:
-to:设置要关联的表 -to_field:设置要关联的表的字段 -related_name:反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'。 classClasses(models.Model): name=models.CharField(max_length=32) classStudent(models.Model): name=models.CharField(max_length=32) theclass=models.ForeignKey(to="Classes") 当我们要查询某个班级关联的所有学生(反向查询)时,我们会这么写: models.Classes.objects.first().student_set.all() 当我们在ForeignKey字段中添加了参数related_name后, classStudent(models.Model): name=models.CharField(max_length=32) theclass=models.ForeignKey(to="Classes",related_name="students") 当我们要查询某个班级关联的所有学生(反向查询)时,我们会这么写: models.Classes.objects.first().students.all() -related_query_name:反向查询操作时,使用的连接前缀,用于替换表名。 -on_delete:当删除关联表中的数据时,当前表与其关联的行的行为。 models.CASCADE:删除关联数据,与之关联也删除 models.DO_NOTHING:删除关联数据,引发错误IntegrityError models.PROTECT:删除关联数据,引发错误ProtectedError models.SET_NULL:删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空) models.SET_DEFAULT:删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值) models.SET:删除关联数据, a.与之关联的值设置为指定值,设置:models.SET(值) b.与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象) deffunc(): return10 classMyModel(models.Model): user=models.ForeignKey( to="User", to_field="id", on_delete=models.SET(func) ) -db_constraint:是否在数据库中创建外键约束,默认为True。
OneToOneField
一对一字段。通常一对一字段用来扩展已有字段。
示例:
classAuthor(models.Model): name=models.CharField(max_length=32) info=models.OneToOneField(to='AuthorInfo') classAuthorInfo(models.Model): phone=models.CharField(max_length=11) email=models.EmailField()
字段参数:
to:设置要关联的表
to_field:设置要关联的字段。
on_delete:同ForeignKey字段。
ManyToManyField
在数据库中通过第三张表来建立关联关系。
字段参数:
to:设置要关联的表
related_name:同ForeignKey字段。
related_query_name:同ForeignKey字段。
symmetrical:仅用于多对多自关联时,指定内部是否创建反向操作的字段。默认为True。
举个例子:
classPerson(models.Model): name=models.CharField(max_length=16) friends=models.ManyToManyField("self")
此时,person对象就没有person_set属性。
classPerson(models.Model): name=models.CharField(max_length=16) friends=models.ManyToManyField("self",symmetrical=False)
此时,person对象现在就可以使用person_set属性进行反向查询。
through:在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。但我们也可以手动创建第三张表来管理多对多关系,此时就需要通过through来指定第三张表的表名。
through_fields:设置关联的字段。
db_table:默认创建第三张表时,数据库中表的名称。
创建多对多关联关系的三种方式
方式一:自行创建第三张表
classBook(models.Model): title=models.CharField(max_length=32,verbose_name="书名") classAuthor(models.Model): name=models.CharField(max_length=32,verbose_name="作者姓名") #自己创建第三张表,分别通过外键关联书和作者 classAuthor2Book(models.Model): author=models.ForeignKey(to="Author") book=models.ForeignKey(to="Book") classMeta: unique_together=("author","book")
方式二:通过ManyToManyField自动创建第三张表
classBook(models.Model): title=models.CharField(max_length=32,verbose_name="书名") #通过ORM自带的ManyToManyField自动创建第三张表 classAuthor(models.Model): name=models.CharField(max_length=32,verbose_name="作者姓名") books=models.ManyToManyField(to="Book",related_name="authors")
方式三:设置ManyTomanyField并指定自行创建的第三张表
classBook(models.Model): title=models.CharField(max_length=32,verbose_name="书名") #自己创建第三张表,并通过ManyToManyField指定关联 classAuthor(models.Model): name=models.CharField(max_length=32,verbose_name="作者姓名") books=models.ManyToManyField(to="Book",through="Author2Book",through_fields=("author","book")) #through_fields接受一个2元组('field1','field2'): #其中field1是定义ManyToManyField的模型外键的名(author),field2是关联目标模型(book)的外键名。 classAuthor2Book(models.Model): author=models.ForeignKey(to="Author") book=models.ForeignKey(to="Book") classMeta: unique_together=("author","book")
注意:当我们需要在第三张关系表中存储额外的字段时,就要使用第三种方式。
元信息
ORM对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息。主要字段如下:
db_table:ORM在数据库中的表名默认是app_类名,可以通过db_table可以重写表名。
index_together:联合索引
unique_together:联合唯一索引
ordering:指定默认按什么字段排序。只有设置了该属性,我们查询到的结果才可以被reverse()。
其他属性详情请查看:官方文档
以上这篇django模型动态修改参数,增加filter字段的方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。