Django休息框架 - 过滤序列化器字段

时间:2015-02-03 21:55:22

标签: django django-rest-framework

我对Django REST-full框架有疑问。

当产品已呈现到远程客户端时,每个产品都会收集带有过滤数据的文件。

例如,模型可能是这样的。

 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)

2 个答案:

答案 0 :(得分:49)

这样的事情怎么样:

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

    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。希望这可以帮助。

答案 1 :(得分:0)

您现在可以(从Django 1.7开始)使用Prefetch对象替代DRF SerializerMethodField的查询集中的ViewSet,这会导致每个对象再进行一次数据库查询:

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相比,可确保优越的性能。