Django rest框架-序列化器字段的过滤

2exbekwf  于 2022-12-27  发布在  Go
关注(0)|答案(2)|浏览(194)

我对Django的REST全框架有疑问。
当产品被渲染到远程客户端时,每个产品都有一个过滤数据的文件.
例如,模型可能是这样的。

class Product(models.Model):
      name = models.CharField()

 class Like(models.Model):
      product = models.ForeignKey(Product, related_name="likes")

在客户端上,产品的每个都以真实值计数,而不是虚假值。
所以我尝试在序列化器中使用下面的代码。

class ProductSerializer(serializers.ModelSerializer):

    likes = serializers.PrimaryKeyRelatedField(many=True, queryset=Like.objects.filter(whether_like=True))

    class Meta:
        model = Product
        fields = ('id', 'name', 'likes')

但是,这并不像我想要的那样工作。
我该怎么办?
以下是额外的视图代码。

@api_view(['GET'])
def product_list(request, user_id, format=None):

    if request.method == 'GET':
        products = Product.objects.all()
        serializer = ProductSerializer(products, many=True)

        return Response(serializer.data)
6l7fqoea

6l7fqoea1#

不如这样:

class ProductSerializer(serializers.ModelSerializer):
    likes = serializers.SerializerMethodField()

    def get_likes(self, product):
        qs = Like.objects.filter(whether_like=True, product=product)
        serializer = LikeSerializer(instance=qs, many=True)
        return serializer.data

    class Meta:
        model = Product
        fields = ('id', 'name', 'likes')
    • LikeSerializer为简洁起见省略。
whlutmcx

whlutmcx2#

SerializerMethodField会给每个对象增加一个额外的数据库查询,而现在(从Django 1.7开始)可以在DRF ViewSet的查询集中使用Prefetch对象:

from rest_framework import viewsets
from django.db.models import Prefetch

class ProductViewSet(viewsets.ModelViewSet):
    queryset = Product.objects.prefetch_related(Prefetch(
        'likes',
        queryset=Like.objects.filter(like=True)))

预取只需要一个查询,确保了与SerializerMethodField相比的上级性能。

相关问题