带有Q和多个类别的django查询

Posted

技术标签:

【中文标题】带有Q和多个类别的django查询【英文标题】:django query with Q and multiple categories 【发布时间】:2013-04-12 20:21:22 【问题描述】:

我有以下模型结构:

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


class Topping(models.Model):
    name = models.CharField(max_length=50)
    pizza = models.ManyToManyField(Pizza)

我想找到所有带有火腿或奶酪或两者的披萨,这是标准的 django 方式吗?: from django.db.models 导入 Q

Pizza.objects.filter(Q(topping__name='ham') | Q(topping__name='cheese'))

如果我有一个浇头列表,我如何以编程方式进行操作,例如?:

['ham','cheese']

【问题讨论】:

【参考方案1】:

我肯定会将多对多关系交换为从 Pizza 到 Topping。 为什么要先查询所有配料对象以获取列表,然后将其与比萨饼进行比较?我相信您主要想展示一个带有配料的比萨饼,而不是显示具有特定配料的比萨饼列表。我猜会更容易(除非您的应用主要是关于顶部)...

【讨论】:

你是指性能吗?据我所知,多对多是对称的。就我而言,浇头是类别的一个例子。想象一下,我不仅有带配料的比萨饼,还有砂锅菜。然后我的***课程也将包含与砂锅课程的多对多关系。然后我在一个类中得到了所有的多字段 ManyToMany 可以是对称的,如果您将其用作与自身的关系。关于砂锅,这确实是有道理的。 (发布答案时没有意识到这一点。)是的,我专注于表演【参考方案2】:

您可以使用 dicts 和 **kwargs 来做到这一点,但没有必要:使用__in 更容易:

topping_list = ['ham', 'cheese']
Pizza.objects.filter(topping__name__in=topping_list)

【讨论】:

以上是关于带有Q和多个类别的django查询的主要内容,如果未能解决你的问题,请参考以下文章

带有验证和多个表单处理的 Django Ajax 提交

django按类别列出,带有indexview和detailview类

Django:查询多条记录的最有效方法?

手动检索带有 JSON 类别/标签的 Wordpress 帖子

带有多个表的 Symfony sfDoctrinePager

具有多个字段的模型中的查询集(Django)