django queryset查询相关

简单记一笔,后面整理

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 - 博客园

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值