I have question about Django REST-full framework.
When products have rendered into remote client, each of product takes a filed with filtered data.
For example, model may be like this.
class Product(models.Model): name = models.CharField() class Like(models.Model): product = models.ForeignKey(Product, related_name="likes") On the client, each likes of product counted with true value, not false.
So I tried with below code in the serializer.
class ProductSerializer(serializers.ModelSerializer): likes = serializers.PrimaryKeyRelatedField(many=True, queryset=Like.objects.filter(whether_like=True)) class Meta: model = Product fields = ('id', 'name', 'likes') But, that is not working as I wanted.
What should I do?
The following is extra view code.
@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)
To serialize a queryset or list of objects instead of a single object instance, you should pass the many=True flag when instantiating the serializer. You can then pass a queryset or list of objects to be serialized.
In function based views we can pass extra context to serializer with "context" parameter with a dictionary. To access the extra context data inside the serializer we can simply access it with "self. context". From example, to get "exclude_email_list" we just used code 'exclude_email_list = self.
Serializers in Django REST Framework are responsible for converting objects into data types understandable by javascript and front-end frameworks. Serializers also provide deserialization, allowing parsed data to be converted back into complex types, after first validating the incoming data.
How about something like this:
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 omitted for brevity. Hope this helps.
Instead of SerializerMethodField, which causes one additional database query per object, you can now (starting with Django 1.7) use Prefetch objects in the queryset of your DRF 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))) The prefetch needs just one query, ensuring vastly superior performance compared to SerializerMethodField.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With