2015-02-03 4 views
15

Ho una domanda sulla struttura completa di Django REST.Quadro di riposo Django - filtro per il campo del serializzatore

Quando i prodotti sono sottoposti a rendering nel client remoto, ciascun prodotto viene archiviato con dati filtrati.

Ad esempio, il modello potrebbe essere come questo.

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

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

Sul client, ogni piace del prodotto contato con valore vero, non falso.

Così ho provato con il codice seguente nel serializzatore.

class ProductSerializer(serializers.ModelSerializer): 

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

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

Ma, non funziona come volevo.

Cosa devo fare?

Quanto segue è un codice di visualizzazione supplementare.

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

risposta

29

Che ne dite di qualcosa di simile:

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 omesse per brevità. Spero che questo ti aiuti.

+0

E .. dove posso vedere un riferimento aggiuntivo per questo? –

+0

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

+0

Sei stato di grande aiuto. Grazie!! –