Djangomodelsfilter筛选条件详解
条件选取querySet的时候,filter表⽰=,exclude表⽰!=。
querySet.distinct() 去重复
__exact 精确等于 like 'aaa'
__iexact 精确等于忽略⼤⼩写 ilike 'aaa'
__contains 包含 like '%aaa%'
__icontains 包含忽略⼤⼩写 ilike '%aaa%',但是对于sqlite来说,contains的作⽤效果等同于icontains。
__gt ⼤于
__gte ⼤于等于
__lt ⼩于
__lte ⼩于等于
__in 存在于⼀个list范围内
__startswith 以...开头
__istartswith 以...开头忽略⼤⼩写
__endswith 以...结尾
__iendswith 以...结尾,忽略⼤⼩写
__range 在...范围内
__year ⽇期字段的年份
__month ⽇期字段的⽉份
__day ⽇期字段的⽇django登录注册功能
__isnull=True/False
例q1.filter(pub_date__gte=day())表⽰为时间>=now,q1.exclude(pub_date__gte=dat
day())表⽰为<=now “在django models中取得⼀个字段的distinct值”。
就是select distinct xxx from table_name ...这样的功能。
使⽤values会⽣成ValuesQuerySet(形如N个dict组成的list),猜测⼤数据⽆额外性能影响,毕竟queryset系列都是使⽤时才查询操作的。
xxxx.objects.values("field_name").distinct()
或者
xxxx.objects.distinct().values("field_name")
补充知识:django中的和objects.filter⽅法的区别
为了说明它们两者的区别定义2个models
1 2 3 4 5class Student(models.Model):
name =models.CharField('姓名', max_length=20, default='') age =models.CharField('年龄', max_length=20, default='') class Book(models.Model):
student =models.ForeignKey(Student)
⼀. 先说下django的():
django的get是从数据库的取得⼀个匹配的结果,返回⼀个对象,如果记录不存在的话,它会报错。
⽐如我数据库⾥有⼀条记录,记录的name的值是"django"的话,我⽤student = (name='django'),
返回的是⼀个记录对象,你可以通过student.__dict__来查看,它返回的是⼀个字典的形式,{'key':valeus},key是字段的名称,⽽values是值的内容。
⽽如果我⽤get⽅法来查询⼀个数据库⾥不存在的记录,程序会报错。
⽐如:
student = (name='python')
如果你⽤django的get去取得关联表的数据的话,⽽关键表的数据如果多于2条的话也会报错。
⽐如我的student表⾥有⼀个记录:
id name age
1 python 24
book表:
id student_id
1 1
2 1
我⽤
1 2student =(name='python') book =(student)
它也会报错,因为book表有2条记录和student表相匹配。
⼆. 再说下django filter:
django的filter⽅法是从数据库的取得匹配的结果,返回⼀个对象列表,如果记录不存在的话,它会返回[]。
⽐如我数据库⾥有⼀条记录,记录的name的值是Python的话,我⽤
student = Student.objects.filter(name='python')
它返回的student是⼀个对象的列表,可以看的出来student[0]和上⾯的get⽅式返回的student的结果是⼀样的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论