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

Django mysql中的多对多关系和条件过滤,django,python-3.x,lambda,django-views,Django,Python 3.x,Lambda,Django Views,我在mysql中有下表 模型如下: class cube(models.Model): pid = models.IntegerField() av = models.CharField(max_length=100) sid = models.IntegerField() st = models.IntegerField() 我想要达到的是我想知道pid的列表 (sid=1,st>=5) and (sid=2,st>=7) 根据屏幕截图,这将从

我在mysql中有下表

模型如下:

class cube(models.Model):
    pid = models.IntegerField()
    av = models.CharField(max_length=100)
    sid = models.IntegerField()
    st = models.IntegerField()
我想要达到的是我想知道pid的列表

(sid=1,st>=5) and (sid=2,st>=7)
根据屏幕截图,这将从我的表中得到两个PID-3214和3215。 pid 3213不满足条件,因此不返回

我尝试以下方法来实现我的要求:

查看代码:

testq=(cube.objects.filter((Q(sid='1') & Q(srt_gte="5")) & (Q(sid='2') & Q(srt_gte="7")))
也在用这种方式尝试lambda-

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语句 (λx: 1如果还有其他问题 0 )

这不起作用:(

尝试了以下其他方法:

testq=cube.objects.filter(Q(sid__in=[1,2])& (Q(srt__gte=[5,7]))).annotate(c=Count('sid')).filter(c=2)
看来这是错的

不知道如何才能按照我的要求得到结果

 List of pid's who has (sid=1,st>=5) and (sid=2,st>=7)
以下是该要求的SQL等效值:

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;

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

testq = cube.objects.filter(Q(sid='1', st_gte="5") | Q(sid='2', st_gte="7"))
AND条件不起作用,因为数据库中的单个记录不能同时具有
sid=1
sid=2
(这是两个独立的记录)。然后可以使用
testq.values\u list('pid',flat=True)
仅获取
pid

请注意,这将提供重复项(您应该获得类似于
[3214321432153215]
),因此您需要转换为一个集合:

testq = set(testq)  # note: this will evaluate your query
或者对结果查询集调用
.distinct()

testq = testq.distinct()  # testq is still a QuerySet object.
另一种方法是,如果您确定SQL查询返回您想要的结果,则可以下拉并只使用
raw
方法

testq = cube.objects.raw(your_sql)
然后,您可以检查testq或对其进行迭代以提取所需的数据


希望这能有所帮助。

如果我在过滤器中使用“|”,它会返回满足任一条件的行。因此,我将丢失所需的集,尝试根据输入集获取满足两个条件的PID。这就是原因,我在sql查询中使用了按分组的case语句pid@SathishPanduga你考虑过了吗d使用.raw来运行您的查询?我刚刚用一个示例和这些文档的链接更新了我的答案。嗨,Brad,谢谢更新!如果我使用raw查询,将很难对20个条件使用筛选器..尝试根据输入使用多个case语句,但我觉得有比多个statem更有效的方法sql查询中的ents。我需要对表使用20个筛选器。这就是问题所在。
testq = cube.objects.raw(your_sql)