如何在 DRF 中仅显示少数多对多关系?

How to show only a few Many-to-many relations in DRF?

举个例子,如果我有 2 个模型和一个简单的视图:

class Recipe(model.Model):
    created_at = model.DateField(auto_add_now=True)


class RecipeBook(model.Model):
    recipes = model.ManyToManyField(Recipe)

...

class RecipeBookList(ListAPIView):
    queryset = RecipeBook.objects.all()
    serializer_class = RecipeBookSerializer

...

class RecipeBookSerializer(serializers.ModelSerializer):
    recipe = RecipeSerializer(many=True, read_ony=True)
    
    class Meta:
        model = RecipeBook
        fields = "__all__"

在使用简单的 GET 方法显示所有餐厅时,最好的方法是只显示创建的前 5 个菜谱而不是所有菜谱?

查询设置方式:

您可以在查询集中指定自定义 Prefetch 操作以限制预取的相关对象:

queryset.prefetch_related(Prefetch('recipes', queryset=Recipe.objects.all()[:5]))

文档:https://docs.djangoproject.com/en/3.2/ref/models/querysets/#prefetch-objects

序列化方式:

您可以使用 source 为 return 自定义查询集提供自定义方法

class RecipeBookSerializer(serializers.ModelSerializer):
    recipes = RecipeSerializer(many=True, read_only=Treue, source='get_recipes')

    class Meta:
        model = RecipeBook
        fields = "__all__"

    def get_recipes(self, obj):
        return obj.recipes.all()[:5]

然后使用prefetch_related("recipes")减少相关查询。

来源:django REST framework - limited queryset for nested ModelSerializer?

序列化方式的问题在于,要么对每个食谱书对象执行相关的食谱查询,要么所有相关的食谱都是从头开始预取的。