Django rest framework - 序列化器字段的过滤
Django rest framework - filtering for serializer field
我对 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)
这样的事情怎么样:
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
为简洁起见省略。希望这有帮助。
您现在可以(从 Django 1.7 开始)在 DRF ViewSet
的查询集中使用 Prefetch
个对象,而不是 SerializerMethodField
,这会导致每个对象一个额外的数据库查询:
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
相比,确保了卓越的性能。
我对 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)
这样的事情怎么样:
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
为简洁起见省略。希望这有帮助。
您现在可以(从 Django 1.7 开始)在 DRF ViewSet
的查询集中使用 Prefetch
个对象,而不是 SerializerMethodField
,这会导致每个对象一个额外的数据库查询:
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
相比,确保了卓越的性能。