Django查询ManyToMany字段中的记录总数

时间:2019-05-31 15:45:52

标签: django django-models

给出两个模型,这些模型由不带贯穿表的ManyToMany连接:

class Ingredient(models.Model):
    name = models.CharField(max_length=255)

class Recipe(models.Model):
    name = models.CharField(max_length=255)
    ingredients = models.ManyToManyField(Ingredient)

如何查找配方中使用的成分实例的总数?

例如,如果我有两种配料(苹果和糖)和两种食谱(苹果派和甜甜圈),我怎么知道有3种用法(两种是因为苹果派使用苹果和糖,另一种是因为甜甜圈)用糖)?

我可以执行以下操作:

count = 0
for recipe in Recipe.objects.all():
  count += recipe.ingredients.count()

但是会生成太多查询。

有没有一种简单的方法可以通过注释/汇总来获取此数字?

3 个答案:

答案 0 :(得分:1)

我们可以这样尝试(当然,避免了很多#0 W3\\Sausage\\Mushroom->setCredentials() called at [/sausage/common/library/W3/Vzaar/Api.php:40] #1 W3\\Sausage\\Mushroom->__construct() called at [/sausage/common/modules/video.mod.php:24] #2 ModVideo->__construct() called at [/sausage/common/core/modules.core.php:133] #3 Modules->__get() called at [/sausage/common/search/Classified/ESAdapter.php:399] #4 Base\\Search\\Classified\\ESAdapter->getVideoInfo() called at [/sausage/common/search/Classified/ESAdapter.php:436] #5 Base\\Search\\Classified\\ESAdapter->fillDataSet() called at [/sausage/common/search/Adapter.php:58] 的点击。使用数据库聚合)。

DB

答案 1 :(得分:0)

recipes = Recipe.objects.all()
for recipe in recipes:
    print(recipe.ingredient_set.count())

答案 2 :(得分:0)

Recipe.through.objects.filter(ingredient=YOUR_INGREDIENT_HERE).count()

Recipe.through是“秘密”表,其中包含用于many_to_many字段(新的 Recipe_ingredients(django的默认名称)对象已创建。如果要使用多少配方来使用给定的成分,则只需用该成分过滤该表并获取计数即可。

在您的示例中,这些是创建的:(伪)

Recipe_ingredients(ingredient=sugar, recipe=apple_pie)
Recipe_ingredients(ingredient=sugar, recipe=doughnut)
Recipe_ingredients(ingredient=apple, recipe=apple_pie)

从这里您可以计算该表的任何内容,如果您想知道所有成分的总用途,就这么简单

Recipe.through.objects.count()