简单记一笔,后面整理
1.values(*fields)
返回一个ValuesQuerySet —— QuerySet 的一个子类,也是一个QuerySet对象,是字典列表形式的QuerySet,迭代时返回字典而不是模型实例对象。每个字典表示一个对象,键对应于模型对象的属性名称 。
# 例如 [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]
2.values_list(*fields,)
与values() 类似,只是在迭代时返回的是元组而不是字典。可以获取number的元组列表,每个元组包含传递给values_list() 调用的字段的值 —— 所以第一个元素为第一个字段,以此类推。
#例如:<QuerySet [(u'WeizhongTu', u'336643078'), (u'twz915', u'915792575'),(u'wangdachui', u'353506297'), (u'xiaoming', u'004466315')]>
values_list方法加个参数flat=True可以获取number的值列表,就获取一个字段返回还是一个QuerySet对象,形式是一个列表
#例如:['WeizhongTu','wangdachui', ...]
3.values("field").distinct() 和distinct("field").values()一样效果
很简单,代码如下xxxx.objects.values("field_name").distinct() #或者
xxxx.objects.distinct().values("field_name") 这两句实际生成的sql都一样。
4.多表连接查询:当我知道这点的时候顿时觉得django太NX了
class A(models.Model):
name = models.CharField(u'名称')
class B(models.Model):
aa = models.ForeignKey(A)
B.objects.filter(aa__name__contains='searchtitle')
5.反向查询(model 外键反向查询)
class A(models.Model):
name = models.CharField(u'名称')
class B(models.Model):
aa = models.ForeignKey(A,related_name="FAN")
bb = models.CharField(u'名称')
A.FAN.all():是一组以A为外键的B实例
查A: A.objects.filter(FAN__bb='XXXX') 可以通过__各种关系查找。还可以直接用model的小写 A.objects.filter(b__bb='xxxx')
6.条件选取querySet的时候,filter表示=,exclude表示!=
querySet.distinct() 去重
__exact 精确等于 like 'aaa'
__iexact 精确等于 忽略大小写 ilike 'aaa'
__contains 包含 like '%aaa%'
__icontains 包含 忽略大小写 ilike '%a%',对于sqlite来说,contains的作用效果等同于icontains。
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__startswith 以...开头
__istartswith 以...开头 忽略大小写
__endswith 以...结尾
__iendswith 以...结尾,忽略大小写
__range 在...范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__week_day (__week_day=1--根据星期来进行查找。1表示星期天,7表示星期六,2-6代表的是星期一到星期五)
__time:根据分时秒来进行查找。如果要具体到秒,一般比较难匹配到,可以使用区间的方式来进行查找。区间使用`range`条件。比如想要获取17时/10分/27-28秒之间的文章,那么可以通过以下代码来实现:
__isnull=True/False
articles = Article.objects.filter(create_time__time__range=(start_time,end_time))
articles = Article.objects.filter(create_time__week_day=4)
例子:
q1 = Entry.objects.filter(headline__startswith="What")
q2 = q1.exclude(pub_date__gte=datetime.date.today())
q3 = q1.filter(pub_date__gte=datetime.date.today())
q = q.filter(pub_date__lte=datetime.date.today())
q = q.exclude(body_text__icontains="food")
# 表示时间>=now,
q1.filter(pub_date__gte=datetime.date.today())
# 表示时间<=now
q1.exclude(pub_date__gte=datetime.date.today())
7.对model某个字段去重
xxxx.objects.values("field_name").distinct()
#或者
xxxx.objects.distinct().values("field_name")
8. 关于queryset缓存
queryset是有缓存的
a = A.objects.all(),
print [i for i in a].
第一次执行打印会查询数据库,然后结果会被保存在queryset内置的cache中,再执行print的时候就会取自缓存。
queryset是否为空
1. if queryset:pass
2.if queryset.count>0:
pass
3.if queryset.exists():
pass.
三种方式性能依次提升。
当queryset非常巨大时,cache会成为问题。此时可以queryset.iterator(),迭代器的用处就不多说了,根据具体需求情况使用。
相关:
Django之Models进阶操作(字段属性) - 小L小 - 博客园
django[三] ORM操作进阶 - richardzgt - 博客园