【问题标题】:django - filtering via ManyToMany fielddjango - 通过 ManyToMany 字段过滤
【发布时间】:2021-06-07 07:16:41
【问题描述】:

假设我有这样的模型:

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


class Topping(models.Model):
    name = models.CharField(max_length=100)


class Flavor(models.Model):
    name = models.CharField(max_length=100)
    of_topping = models.ForeignKey(Topping, on_delete=models.CASCADE)
    on_pizzas = models.ManyToManyField(Pizza)

然后,我要在“意大利腊肠”上添加“辣”、“不辣”和“意大利”三种口味,在“木耳”上添加“香菇”、“牛肝菌”和“木耳”口味。

比萨受到限制,它不能包含同一 Topping 类但口味不同的两种浇头。 (例如,没有意大利腊肠和辣味腊肠的披萨)。

现在,假设我的披萨店提供这些披萨:

  • 玛格丽特(无浇头)
  • 意大利腊肠(非辣味腊肠)
  • Funghi(香菇)
  • 美味(意大利腊肠和香菇)
  • 有毒(辣香肠和木耳)
  • 特色菜(意大利腊肠和牛肝菌)

现在,对于客户 Bob,我知道是约束,例如他会吃香菇和意大利腊肠(但也会吃任何只有其中一部分作为配料的东西)。 对于 Bob,我不想知道我可以给他 Margherita、Funghi 或 Yummy。 对于每个客户,约束列表将仅包括(至多)每种浇头一种口味。所以不会有顾客说她既喜欢辣又喜欢不辣的意大利腊肠。

如何编写执行此操作的过滤器?类似的东西

Pizza.objects.filter(flavor__??=list_of_flavor_constraints)

【问题讨论】:

    标签: python django


    【解决方案1】:

    您的查询对于单个查询来说过于复杂。它要么需要多个连接,要么需要一个子查询。我还没有测试过,但试试这个:

    from django.db.models import Subquery
    
    excluded_pizzas = Flavor.on_pizzas.through.objects.exclude(flavor__in=list_of_flavor_constraints).values('pizza')
    result = Pizza.objects.exclude(id__in=Subquery(excluded_pizzas))
    

    excluded_pizzas 是在中间 m2m 表上执行的子查询,我们在其中排除用户实际想要的口味并选择比萨饼的 id,从而为我们提供实际上不想要的比萨饼。

    接下来,我们实际上排除了这些披萨的 id,从而为我们提供了我们想要的披萨。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 2021-10-18
      • 2018-06-09
      • 2011-12-21
      • 2023-01-15
      • 1970-01-01
      相关资源
      最近更新 更多