【问题标题】:How to annotate queryset with number of common IDs in ManyToManyField如何使用 ManyToManyField 中的公共 ID 数量注释查询集
【发布时间】:2020-11-30 11:01:07
【问题描述】:

我有以下型号:

class Ingredient(models.Model):
    id = models.CharField(primary_key=True, max_length=24)
    name = models.CharField(max_length=100)

class Recipe(models.Model):
    id = models.CharField(primary_key=True, max_length=24)
    name = models.CharField(max_length=100)
    ingredients = models.ManyToManyField(to=Ingredient)

以及具有有效成分 ID 的列表,例如:

ing_id_list = ['5d481cf3abe2d800150de7b6', '5c8c05bee3f3391eda4320b2', ...]

我一直在构建一个带有注释字段的查询集,该字段使用常见相关成分 ID 的数量和列表中的 ID 来丰富食谱:

annotated_recipe_queryset = Recipe.objects.annotate(no_of_common_ings=Count(##PLEASE HELP##))

谁能帮忙?

【问题讨论】:

    标签: python django django-queryset


    【解决方案1】:

    如果您使用的是 Django>=1.8,您可以使用条件聚合。对于您的示例,查询可能是:

    from django.db.models import Count, Case, When, IntegerField
    annotated_recipe_queryset = Recipe.objects.annotate(
            no_of_common_ings=Count(Case(When(
                ingredients__id__in=ing_id_list, then=1), output_field=IntegerField(), ))) 
    
    

    【讨论】:

      猜你喜欢
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 2019-09-23
      相关资源
      最近更新 更多