栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

列表中每个*项目的Django过滤器查询集__in

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

列表中每个*项目的Django过滤器查询集__in

正如jpic和sgallen在评论中所建议的那样,可以.filter()为每个类别添加一个选项。每filter增加一个,就会添加更多的联接,这对于少量的类别来说应该不是问题。

有聚合 方法。对于大量类别,此查询将更短,甚至更快。

您还可以选择使用自定义查询。

一些例子

测试设置:

class Photo(models.Model):
tags = models.ManyToManyField(‘Tag’)

class Tag(models.Model):
name = models.CharField(max_length=50)

def __unipre__(self):    return self.name

In [2]: t1 = Tag.objects.create(name=’holiday’)
In [3]: t2 = Tag.objects.create(name=’summer’)
In [4]: p = Photo.objects.create()
In [5]: p.tags.add(t1)
In [6]: p.tags.add(t2)
In [7]: p.tags.all()
Out[7]: [, ]
使用链接过滤器方法:
In [8]: Photo.objects.filter(tags=t1).filter(tags=t2)
Out[8]: []
结果查询:

In [17]: print Photo.objects.filter(tags=t1).filter(tags=t2).query
SELECt “test_photo”.”id”
FROM “test_photo”
INNER JOIN “test_photo_tags” ON (“test_photo”.”id” = “test_photo_tags”.”photo_id”)
INNER JOIN “test_photo_tags” T4 ON (“test_photo”.”id” = T4.”photo_id”)
WHERe (“test_photo_tags”.”tag_id” = 3 AND T4.”tag_id” = 4 )
请注意,每个都为查询filter添加了更多内容JOINS。

使用注释 方法:
In [29]: from django.db.models import Count
In [30]: Photo.objects.filter(tags__in=[t1, t2]).annotate(num_tags=Count(‘tags’)).filter(num_tags=2)
Out[30]: []
结果查询:

In [32]: print Photo.objects.filter(tags__in=[t1, t2]).annotate(num_tags=Count(‘tags’)).filter(num_tags=2).query
SELECt “test_photo”.”id”, COUNT(“test_photo_tags”.”tag_id”) AS “num_tags”
FROM “test_photo”
LEFT OUTER JOIN “test_photo_tags” ON (“test_photo”.”id” = “test_photo_tags”.”photo_id”)
WHERe (“test_photo_tags”.”tag_id” IN (3, 4))
GROUP BY “test_photo”.”id”, “test_photo”.”id”
HAVINg COUNT(“test_photo_tags”.”tag_id”) = 2
ANDed Q对象不起作用:
In [9]: from django.db.models import Q
In [10]: Photo.objects.filter(Q(tags__name=’holiday’) & Q(tags__name=’summer’))
Out[10]: []
In [11]: from operator import and_
In [12]: Photo.objects.filter(reduce(and_, [Q(tags__name=’holiday’), Q(tags__name=’summer’)]))
Out[12]: []
结果查询:

In [25]: print Photo.objects.filter(Q(tags__name=’holiday’) & Q(tags__name=’summer’)).query
SELECt “test_photo”.”id”
FROM “test_photo”
INNER JOIN “test_photo_tags” ON (“test_photo”.”id” = “test_photo_tags”.”photo_id”)
INNER JOIN “test_tag” ON (“test_photo_tags”.”tag_id” = “test_tag”.”id”)
WHERe (“test_tag”.”name” = holiday AND “test_tag”.”name” = summer )



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/407760.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号