如何在 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?
序列化方式的问题在于,要么对每个食谱书对象执行相关的食谱查询,要么所有相关的食谱都是从头开始预取的。
举个例子,如果我有 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?
序列化方式的问题在于,要么对每个食谱书对象执行相关的食谱查询,要么所有相关的食谱都是从头开始预取的。