首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django mysql中的多到多关系和条件过滤

Django mysql中的多到多关系和条件过滤
EN

Stack Overflow用户
提问于 2015-11-28 16:13:35
回答 1查看 59关注 0票数 0

我在mysql有下面的桌子

以下是模型:

代码语言:javascript
复制
class cube(models.Model):
    pid = models.IntegerField()
    av = models.CharField(max_length=100)
    sid = models.IntegerField()
    st = models.IntegerField()

我想要实现的是我想知道pid的列表

代码语言:javascript
复制
(sid=1,st>=5) and (sid=2,st>=7)

这将根据屏幕截图从我的表中得到两个PIDS-3214和3215。pid 3213不满足条件,因此不返回。

我正在尝试以下方法来实现我的需求:

视图代码:

代码语言:javascript
复制
testq=(cube.objects.filter((Q(sid='1') & Q(srt_gte="5")) & (Q(sid='2') & Q(srt_gte="7")))

也试着用这样的方式-

代码语言:javascript
复制
input = [{"sid":1,"st":5},{"sid":2,"st":7}]
queries = [Q(sid=i['sid'], st__gte=i['st']) for i in input]
sid_query = reduce(lambda x, y:  ________ , queries)

在上面的lambda中,我尝试使用case语句,如(lambda :1,如果查询是0)。

代码语言:javascript
复制
queryset=cube.objects.values_list('pid').filter(sid_query).annotate('pid') 

这不起作用

尝试了如下其他方式:

代码语言:javascript
复制
testq=cube.objects.filter(Q(sid__in=[1,2])& (Q(srt__gte=[5,7]))).annotate(c=Count('sid')).filter(c=2)

看来这是不对的。

不知道如何才能根据我的要求得到结果。

代码语言:javascript
复制
 List of pid's who has (sid=1,st>=5) and (sid=2,st>=7)

以下是该需求的SQL等效项:

代码语言:javascript
复制
select b.pid
from cube b
group by b.pid
having sum(case when (b.sid = 1) and (b.srt >= 5) then 1 else 0 end) > 0 AND
       sum(case when (b.sid = 2) and (b.srt >= 7) then 1 else 0 end) > 0;
EN

回答 1

Stack Overflow用户

发布于 2015-11-28 17:04:57

我相信您需要一个OR条件而不是一个AND,您的第一个查询看起来几乎是正确的。您可以将一些条件组合到Q对象中,以使其更具可读性。

代码语言:javascript
复制
testq = cube.objects.filter(Q(sid='1', st_gte="5") | Q(sid='2', st_gte="7"))

AND条件不能工作,因为数据库中的单个记录不能同时拥有sid=1sid=2 (这是两个单独的记录)。然后,您可以使用testq.values_list('pid', flat=True)来获取pid值。

请注意,这将给您提供副本(您应该得到类似于[3214, 3214, 3215, 3215]的内容),因此您要么需要转换为一个集合:

代码语言:javascript
复制
testq = set(testq)  # note: this will evaluate your query

或者在结果查询集上调用.distinct()

代码语言:javascript
复制
testq = testq.distinct()  # testq is still a QuerySet object.

如果您确信您的SQL查询返回您想要的结果,则另一种方法是下拉并只使用raw方法。

代码语言:javascript
复制
testq = cube.objects.raw(your_sql)

然后,您可以检查testq或迭代它,提取所需的数据。见用于执行原始查询的文档

希望这能有所帮助。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33973475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档