2015-02-03 5 views
15

Mam pytanie dotyczące Django REST pełne ramy.Django reszta framework - filtrowanie dla serializera pole

Gdy produkty są renderowane do klienta zdalnego, każdy produkt pobiera dane z przefiltrowanymi danymi.

Na przykład model może być podobny.

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

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

Na kliencie, każdy lubi produktu liczy się z prawdziwej wartości, a nie fałszywe.

Próbowałem więc z poniższym kodem w serializatorze.

class ProductSerializer(serializers.ModelSerializer): 

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

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

Ale to nie działa tak, jak chciałem.

Co należy zrobić?

Poniżej przedstawiono dodatkowy kod widoku.

@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) 

Odpowiedz

29

Jak o coś takiego:

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 pominięte dla zwięzłości. Mam nadzieję że to pomoże.

+0

I .. gdzie mogę zobaczyć dodatkowe odniesienie do tego? –

+0

http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield – mishbah

+0

Byłeś świetną pomocą. Dziękuję Ci!! –