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的反射机制
Jun 28 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
Nov 30 Python
神经网络(BP)算法Python实现及应用
Apr 16 Python
Python爬虫包BeautifulSoup简介与安装(一)
Jun 17 Python
pycharm执行python时,填写参数的方法
Oct 29 Python
python递归法解决棋盘分割问题
Jul 17 Python
详解Python3迁移接口变化采坑记
Oct 11 Python
详解numpy矩阵的创建与数据类型
Oct 18 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
Feb 17 Python
Python用类实现扑克牌发牌的示例代码
Jun 01 Python
Python:__eq__和__str__函数的使用示例
Sep 26 Python
python实现暗通道去雾算法的示例
Sep 27 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中register_globals参数为OFF和ON的区别(register_globals 使用详解)
2012/02/05 PHP
关于crontab的使用详解
2013/06/24 PHP
php根据日期显示所在星座的方法
2015/07/13 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
2016/11/05 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
2020/08/17 PHP
javascript 四则运算精度修正函数代码
2010/05/31 Javascript
JavaScript中的this,call,apply使用及区别详解
2016/01/29 Javascript
关于JS 预解释的相关理解
2016/06/28 Javascript
前端微信支付js代码
2016/07/25 Javascript
解析NodeJS异步I/O的实现
2017/04/13 NodeJs
BootStrap daterangepicker 双日历控件
2017/06/02 Javascript
用js屏蔽被http劫持的浮动广告实现方法
2017/08/10 Javascript
webstorm添加*.vue文件支持
2018/05/08 Javascript
浅谈redux以及react-redux简单实现
2018/08/28 Javascript
使用Vuex解决Vue中的身份验证问题
2018/09/28 Javascript
JavaScript数据结构与算法之检索算法实例分析【顺序查找、最大最小值、自组织查询】
2019/02/22 Javascript
详解ES6 export default 和 import语句中的解构赋值
2019/05/28 Javascript
Python内置函数的用法实例教程
2014/09/08 Python
python多重继承新算法C3介绍
2014/09/28 Python
Python多维/嵌套字典数据无限遍历的实现
2016/11/04 Python
python实现根据给定坐标点生成多边形mask的例子
2020/02/18 Python
解决keras模型保存h5文件提示无此目录问题
2020/07/01 Python
python 基于opencv实现图像增强
2020/12/23 Python
Fairyseason:为个人和批发商提供女装和配件
2017/03/01 全球购物
美体小铺波兰官方网站:The Body Shop波兰
2019/09/03 全球购物
宏碁西班牙官网:Acer西班牙
2021/01/08 全球购物
用C#语言写出与SQLSERVER访问时的具体过程
2013/04/16 面试题
元旦联欢会感言
2014/03/04 职场文书
教师个人自我评价范文
2014/04/13 职场文书
科级干部群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
2014副镇长民主生活会个人对照检查材料思想汇报
2014/09/30 职场文书
2015年语文教研组工作总结
2015/05/23 职场文书
企业催款函范本
2015/06/24 职场文书
创业计划书之外语培训班
2019/11/02 职场文书
pytorch常用数据类型所占字节数对照表一览
2021/05/17 Python