gpt4 book ai didi

Django——过滤时将多对多对象集视为一个实体

转载 作者:行者123 更新时间:2023-12-02 04:09:28 25 4
gpt4 key购买 nike

假设我有三个模型——Person、Food、Flavor。

Person 和 Flavor 共享多对多关系(一个人可以喜欢多种口味)。
食物和 flavor 具有多对多的关系(一种食物可以有多种 flavor )。

对于任何给定的人,我想退回所有具有一组 flavor 的食物,这些 flavor 是该人 flavor 的子集。

例如,

personA.flavor.all() --> ['辣','甜','苦']
foodA.flavor.all() --> ['辣','甜']
foodB.flavor.all() --> ['辣,'苦']
foodC.flavor.all() --> ['苦味','油腻']

我想在 Food.objects 上使用 Django 的过滤器,以便它返回一个包含 foodA 和 foodB 的 QuerySet。

我知道如果我将用户的口味转换为一组,并在每种食物的口味列表上调用 issuperset (并将此类食物添加到预定义的列表中),我可以获得类似的结果,但我想知道(并希望) 如果有一个更优雅的解决方案涉及 django 模型的过滤器函数,它会返回一个 QuerySet 而不是列表。

非常感谢您的帮助。

最佳答案

我认为仅使用 django orm 就无法实现您的目标。它会以某种方式涉及生成能够检查结果集是否是另一个结果集的超集的 SQL。如果您可以旋转结果集,这将是可能的(在 sql 中)。 SQL Server 具有可以执行此操作的 PIVOT 和 UNPIVOT 运算符(其他 DBMS 包可能具有类似的运算符),但 django 无法生成此类 SQL。我怀疑任何通用 ORM 都能够做到这一点。

您已经知道的解决方案已经足够优雅了。两个查询足以获得所需的所有数据,然后通用语言可以更轻松地确定集合成员资格。在 SQL 中这样做会有点像噩梦(我认为)。

不过是个好问题。我开始编写 SQL 来实现结果,直到我意识到这将比我没有得到报酬的时间要麻烦得多(而且可能超出我的深度!)。如果有人发布它,那么看到一个纯 sql 解决方案会非常有趣。

关于Django——过滤时将多对多对象集视为一个实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6030850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com