django模型动态修改参数,增加 filter 字段的方式


Posted in Python onMarch 16, 2020

我就废话不多说啦,还是直接看代码吧!

kwargs = {
# 动态查询的字段
}
 
# 选择deleted_datetime为空的记录
if exclude_deleted:
kwargs[ 'deleted_datetime__isnull' ] = True
 
# 选择特的category
if category is not None:
kwargs[ 'category' ] = category
 
# 特定的用户
if current_user_only:
kwargs[ 'user' ] = current_user
 
# 根据标题查询
if title_search_query != '':
kwargs[ 'title__icontains' ] = title_search_query
 
# 应用所有的查询
entries = Entry.objects.filter( **kwargs )
# 打印出所有的结果检查
print entries

用这种方式,在Q object 方式下,是有问题的,要采用如下方式:

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:一个整数类型,范围在 -2147483648 to 2147483647。

CharField:字符类型,必须提供max_length参数, max_length表示字符长度

DateField:日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例。

DateTimeField:日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。

所有字段合集

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)
    - 二进制类型

ORM字段与数据库实际字段的对应关系

对应关系:
  '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)',

字段参数

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'。
 
	class Classes(models.Model):
		name = models.CharField(max_length=32)
 
	class Student(models.Model):
		name = models.CharField(max_length=32)
		theclass = models.ForeignKey(to="Classes")
 
	当我们要查询某个班级关联的所有学生(反向查询)时,我们会这么写:
 
	models.Classes.objects.first().student_set.all()
 
	当我们在ForeignKey字段中添加了参数 related_name 后,
 
	class Student(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(可执行对象)
		
		def func():
			return 10
 
		class MyModel(models.Model):
			user = models.ForeignKey(
				to="User",
				to_field="id",
				on_delete=models.SET(func)
			)
- db_constraint:是否在数据库中创建外键约束,默认为True。

OneToOneField

一对一字段。通常一对一字段用来扩展已有字段。

示例:

class Author(models.Model):
  name = models.CharField(max_length=32)
  info = models.OneToOneField(to='AuthorInfo')
  
 
class AuthorInfo(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。

举个例子:

class Person(models.Model):
  name = models.CharField(max_length=16)
  friends = models.ManyToManyField("self")

此时,person对象就没有person_set属性。

class Person(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:默认创建第三张表时,数据库中表的名称。

创建多对多关联关系的三种方式

方式一:自行创建第三张表

class Book(models.Model):
  title = models.CharField(max_length=32, verbose_name="书名")
 
 
class Author(models.Model):
  name = models.CharField(max_length=32, verbose_name="作者姓名")
 
 
# 自己创建第三张表,分别通过外键关联书和作者
class Author2Book(models.Model):
  author = models.ForeignKey(to="Author")
  book = models.ForeignKey(to="Book")
 
  class Meta:
    unique_together = ("author", "book")

方式二:通过ManyToManyField自动创建第三张表

class Book(models.Model):
  title = models.CharField(max_length=32, verbose_name="书名")
 
 
# 通过ORM自带的ManyToManyField自动创建第三张表
class Author(models.Model):
  name = models.CharField(max_length=32, verbose_name="作者姓名")
  books = models.ManyToManyField(to="Book", related_name="authors")

方式三:设置ManyTomanyField并指定自行创建的第三张表

class Book(models.Model):
  title = models.CharField(max_length=32, verbose_name="书名")
 
 
# 自己创建第三张表,并通过ManyToManyField指定关联
class Author(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)的外键名。
 
 
class Author2Book(models.Model):
  author = models.ForeignKey(to="Author")
  book = models.ForeignKey(to="Book")
 
  class Meta:
    unique_together = ("author", "book")

注意:当我们需要在第三张关系表中存储额外的字段时,就要使用第三种方式。

元信息

ORM对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息。主要字段如下:

db_table: ORM在数据库中的表名默认是 app_类名,可以通过db_table可以重写表名。

index_together: 联合索引

unique_together: 联合唯一索引

ordering: 指定默认按什么字段排序。只有设置了该属性,我们查询到的结果才可以被reverse()。

其他属性详情请查看:官方文档

以上这篇django模型动态修改参数,增加 filter 字段的方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python lxml模块安装教程
Jun 02 Python
Python的条件语句与运算符优先级详解
Oct 13 Python
Python使用smtplib模块发送电子邮件的流程详解
Jun 27 Python
Python中使用platform模块获取系统信息的用法教程
Jul 08 Python
浅谈Python生成器generator之next和send的运行流程(详解)
May 08 Python
浅谈Python使用Bottle来提供一个简单的web服务
Dec 27 Python
在python中使用requests 模拟浏览器发送请求数据的方法
Dec 26 Python
Python爬虫运用正则表达式的方法和优缺点
Aug 25 Python
Django分组聚合查询实例分享
Apr 29 Python
Python中socket网络通信是干嘛的
May 27 Python
python实现时间序列自相关图(acf)、偏自相关图(pacf)教程
Jun 03 Python
Python监听剪切板实现方法代码实例
Nov 11 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
Mar 16 #Python
python高阶函数map()和reduce()实例解析
Mar 16 #Python
Django models filter筛选条件详解
Mar 16 #Python
python递归调用中的坑:打印有值, 返回却None
Mar 16 #Python
django 前端页面如何实现显示前N条数据
Mar 16 #Python
Python迭代器Iterable判断方法解析
Mar 16 #Python
python 递归调用返回None的问题及解决方法
Mar 16 #Python
You might like
Dedecms V3.1 生成HTML速度的优化办法
2007/03/18 PHP
简单实现PHP留言板功能
2016/12/21 PHP
jquery教程限制文本框只能输入数字和小数点示例分享
2014/01/13 Javascript
JavaScript实现广告的关闭与显示效果实例
2015/07/02 Javascript
基于jquery实现百度新闻导航菜单滑动动画
2016/03/15 Javascript
jQuery实现的倒计时效果实例小结
2016/04/16 Javascript
Javascript字符串常用方法详解
2016/07/21 Javascript
jQuery实现邮箱下拉列表自动补全功能
2016/09/08 Javascript
学习vue.js条件渲染
2016/12/03 Javascript
ES6中的箭头函数实例详解
2017/04/06 Javascript
简单实现JavaScript弹幕效果
2020/08/27 Javascript
JavaScript 数组去重并统计重复元素出现的次数实例
2017/12/14 Javascript
Angular利用trackBy提升性能的方法
2018/01/26 Javascript
Node.js之readline模块的使用详解
2019/03/25 Javascript
javascript/jquery实现点击触发事件的方法分析
2019/11/11 jQuery
微信小程序自定义菜单切换栏tabbar组件代码实例
2019/12/30 Javascript
[01:20:06]TNC vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python 域名分析工具实现代码
2009/07/15 Python
Python中为什么要用self探讨
2015/04/14 Python
基于scrapy实现的简单蜘蛛采集程序
2015/04/17 Python
详解Python中的Cookie模块使用
2015/07/06 Python
django session完成状态保持的方法
2018/11/27 Python
python实现引用其他路径包里面的模块
2020/03/09 Python
浅析python函数式编程
2020/09/26 Python
matplotlib部件之套索Lasso的使用
2021/02/24 Python
HTML5 实战PHP之Web页面表单设计
2011/10/09 HTML / CSS
以实惠的价格提供高品质的时尚:Newchic
2018/01/18 全球购物
领导证婚人证婚词
2014/01/13 职场文书
公司年会主持词
2014/03/22 职场文书
年终工作总结范文2014
2014/11/27 职场文书
副总经理岗位职责
2015/02/02 职场文书
南湾猴岛导游词
2015/02/09 职场文书
教研活动主持词
2015/07/03 职场文书
学校运动会简讯
2015/07/20 职场文书
python库sklearn常用操作
2021/08/23 Python
如何解决flex文本溢出问题小结
2022/07/15 HTML / CSS