【发布时间】:2017-11-07 20:29:59
【问题描述】:
我已经阅读了this 和this,但它们并没有解决我的问题,因为它们通过与硬编码的数字进行比较来进行最终的“计数”。我想比较一个数字,它是配方本身所有成分的总和。
让我们假设我的冰箱里有一些原料,它们的 id (= id 数组)。我想看看我能用它做什么。我有这样的模型:
class Ingredient(models.Model):
label = models.CharField(max_length=200, null=True, blank=True,
default=None)
description = models.TextField(null=True, blank=True, default=None)
class Unit(models.Model):
label = models.CharField(max_length=200, null=True, blank=True,
default=None)
abbr = models.CharField(max_length=20, null=True, blank=True,
default=None)
class IngredientUnit(models.Model):
ingredient = models.ForeignKey(Ingredient, null=False, blank=True)
unit = models.ForeignKey(Unit, null=False, blank=True)
measurable = models.BooleanField(default=True, null=False, blank=True)
is_int = models.BooleanField(default=True, null=False, blank=True)
value = models.FloatField(null=True, blank=True, default=0.0)
class Recipe(models.Model):
label = models.CharField(max_length=200, null=True, blank=True,
default=None)
description = models.TextField(null=True, blank=True, default=None)
ingredients = models.ManyToManyField(IngredientUnit)
我想这样做:“选择所有具有所有的配方”的配料数组的配料。例如:“经典香草蛋糕”有这些成分:鸡蛋、万能面粉、发酵粉、小苏打、黄油、糖、香草、酪乳。如果缺少一个,则“经典香草蛋糕”不应出现在结果查询中。相反,如果有更多种成分超过所需成分,则“经典香草蛋糕”应始终出现在结果查询中。
到目前为止,我已经这样做了,但它不起作用。
ingredient_ids = self.request.POST.getlist('ingredient[]', [])
if len(ingredient_ids):
recipes = Recipe.objects\
.filter(ingredients__in=ingredient_ids)\
.annotate(nb_ingredients=Count('ingredients'))\
.filter(nb_ingredients=len(ingredient_ids))
print([a for a in recipes])
问题是nb_ingredients=len(ingredient_ids)应该是nb_ingredients=the number of the ingredients of the current recipe
我该怎么做?
【问题讨论】:
-
我的问题还不是很清楚。你想得到一个包含所有成分的食谱 r(例如成分 ID)?
-
我认为您只是想将注释放在过滤器之前,以便每个食谱都带有其包含的成分数量的注释。
-
@Sagar 我更新了我的问题:我的冰箱里有一些配料,它们的 id (= id 数组)。我想看看我能用它做什么。我想比较一个数字,它是配方本身所有成分的总和。
标签: django django-models django-queryset