Django mysql中的多对多关系和条件过滤
我在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) 根据屏幕截图,这将从
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)