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 获取 Linux 系统信息的代码
Jul 13 Python
在Python的Django框架的视图中使用Session的方法
Jul 23 Python
python实现下载指定网址所有图片的方法
Aug 08 Python
Python获取CPU、内存使用率以及网络使用状态代码
Feb 08 Python
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
Aug 27 Python
python修改文件内容的3种方法详解
Nov 15 Python
python实现FTP循环上传文件
Mar 20 Python
Python中and和or如何使用
May 28 Python
pandas创建DataFrame的7种方法小结
Jun 14 Python
树莓派4B安装Tensorflow的方法步骤
Jul 16 Python
用pushplus+python监控亚马逊到货动态推送微信
Jan 29 Python
python实现简单的学生管理系统
Feb 22 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
在php MYSQL中插入当前时间
2008/04/06 PHP
PHP中for与foreach的区别分析
2011/03/09 PHP
PHP读取PDF内容配合Xpdf的使用
2012/11/24 PHP
PHP里8个鲜为人知的安全函数分析
2014/12/09 PHP
微信公众平台实现获取用户OpenID的方法
2015/04/15 PHP
php异常处理方法实例汇总
2015/06/24 PHP
PHP使用PDO访问oracle数据库的步骤详解
2017/09/29 PHP
Prototype1.5 rc2版指南最后一篇之Position
2007/01/10 Javascript
javascript 中对象的继承〔转贴〕
2007/01/22 Javascript
一段利用WSH获取登录时间的jscript代码
2008/05/11 Javascript
jquery 插件之仿“卓越亚马逊”首页弹出菜单效果
2008/12/25 Javascript
如何调试异步加载页面里包含的js文件
2014/10/30 Javascript
Python脚本后台运行的几种方式
2015/03/09 Javascript
Bootstrap table分页问题汇总
2016/05/30 Javascript
js中删除数组中的某一元素实例(无下标时)
2017/02/28 Javascript
Node.js连接mongodb实例代码
2017/06/06 Javascript
AngularJS实现自定义指令及指令配置项的方法
2017/11/20 Javascript
Node.js动手撸一个静态资源服务器的方法
2019/03/09 Javascript
vue请求服务器数据后绑定不上的解决方法
2019/10/30 Javascript
python按照多个字符对字符串进行分割的方法
2015/03/17 Python
用Python实现换行符转换的脚本的教程
2015/04/16 Python
Python中文竖排显示的方法
2015/07/28 Python
Python实现字符串与数组相互转换功能示例
2017/09/22 Python
Python基于列表模拟堆栈和队列功能示例
2018/01/05 Python
Python列表(list)所有元素的同一操作解析
2019/08/01 Python
基于Python实现船舶的MMSI的获取(推荐)
2019/10/21 Python
python:动态路由的Flask程序代码
2019/11/22 Python
python双端队列原理、实现与使用方法分析
2019/11/27 Python
修改Pandas的行或列的名字(重命名)
2019/12/18 Python
一文轻松掌握python语言命名规范规则
2020/06/18 Python
HTML5边玩边学(2)基础绘图实现方法
2010/09/21 HTML / CSS
英国最受信任的在线眼镜商之一:Fashion Eyewear
2019/10/31 全球购物
商务日语专业毕业生求职信
2013/10/26 职场文书
运动会解说词200字
2014/02/06 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
python自动化八大定位元素讲解
2021/07/09 Python