给出两个模型,这些模型由不带贯穿表的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()
但是会生成太多查询。
有没有一种简单的方法可以通过注释/汇总来获取此数字?
答案 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()