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 相关文章推荐
深入理解Javascript中的this关键字
Mar 27 Python
浅谈scrapy 的基本命令介绍
Jun 13 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
Nov 11 Python
Python算法之图的遍历
Nov 16 Python
Python基于whois模块简单识别网站域名及所有者的方法
Apr 23 Python
python画图系列之个性化显示x轴区段文字的实例
Dec 13 Python
Python解析、提取url关键字的实例详解
Dec 17 Python
解决yum对python依赖版本问题
Jul 05 Python
sklearn+python:线性回归案例
Feb 24 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
Apr 22 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
Jun 17 Python
使用scrapy实现增量式爬取方式
Jun 21 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读取XML值的代码(推荐)
2011/01/01 PHP
PHP中防止SQL注入方法详解
2014/12/25 PHP
php基于PDO连接MSSQL示例DEMO
2016/07/13 PHP
php获取网站根目录物理路径的几种方法(推荐)
2017/03/04 PHP
php字符串过滤strip_tags()函数用法实例分析
2019/06/24 PHP
PHP dirname简单使用代码实例
2020/11/13 PHP
JavaScript 作用域链解析
2014/11/13 Javascript
JS实现在页面随时自定义背景颜色的方法
2015/02/27 Javascript
百度地图API之本地搜索与范围搜索
2015/07/30 Javascript
jQuery使用$.ajax提交表单完整实例
2015/12/11 Javascript
AngularJS自动表单验证
2016/02/01 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
2016/02/16 Javascript
简述JavaScript提交表单的方式 (Using JavaScript Submit Form)
2016/03/18 Javascript
浅谈JavaScript中的分支结构
2016/07/01 Javascript
jQuery 选择符详细介绍及整理
2016/12/02 Javascript
AngularJS实践之使用ng-repeat中$index的注意点
2016/12/22 Javascript
react-native 完整实现登录功能的示例代码
2017/09/11 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
Gulp实现静态网页模块化的方法详解
2018/01/09 Javascript
vue使用xe-utils函数库的具体方法
2018/03/06 Javascript
JavaScript实现异步图像上传功能
2018/07/12 Javascript
JavaScript格式化json和xml的方法示例
2019/01/22 Javascript
从零学Python之入门(二)基本数据类型
2014/05/25 Python
python中强大的format函数实例详解
2018/12/05 Python
python对csv文件追加写入列的方法
2019/08/01 Python
Python实现字符串中某个字母的替代功能
2019/10/21 Python
python实现图片插入文字
2019/11/26 Python
Python telnet登陆功能实现代码
2020/04/16 Python
5行Python代码实现图像分割的步骤详解
2020/05/25 Python
Opencv求取连通区域重心实例
2020/06/04 Python
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
基于HTML5 Canvas的3D动态Chart图表的示例
2017/11/02 HTML / CSS
美国在线眼镜商城:Eyeglasses.com
2017/06/26 全球购物
C#面试题
2016/05/06 面试题
离婚协议书怎样才有法律效力
2014/10/10 职场文书
2016优秀员工先进事迹材料
2016/02/25 职场文书