带有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按类别列出,带有indexview和detailview类
手动检索带有 JSON 类别/标签的 Wordpress 帖子