2013-02-17 20 views
8

Django REST Framework'u kullanarak aşağıdaki Serileştiriciye sahibim. Bu defa ne varRest Framework Serializer Yöntemi

...

serializer.py

class ProductSerializer(serializers.ModelSerializer): 

    score = serializers.SerializerMethodField('get_this_score') 

    class Meta: 
     model = Product 
     fields = ('id', 'title', 'active', 'score') 

    def get_this_score(self, obj): 

     profile = Profile.objects.get(pk=19) 
     score = [val for val in obj.attribute_answers.all() if val in profile.attribute_answers.all()] 
     return (len(score)) 

bu pasajı ile birkaç sorun vardır urls.py

url(r'^products/(?P<profile_id>.+)/$', ProductListScore.as_view(), name='product-list-score'), 

kodun

1) Pram pk = 19, kodlanmış olması gerekir self.kwargs['profile_id']. Denedim ve denedim, ancak kwarg yöntemine nasıl geçeceğini bilmiyorum ve profile_id çalışmasını alamıyorum. yani, onu url'den alamıyorum.

2) Bu kodlardan herhangi biri modellerde mi olmalı? Modellere eklemeyi denedim, ancak yine de bu hataları geçebilir.

models.py yani yöntem sınıfı böyle bir şey yaparak PROFILE_ID alabilmesi için

 def get_score(self, profile): 

     score = [val for val in self.attribute_answers.all() if val in 
profile.attribute_answers.all()] 
      return len(score) 

cevap

21

Serileştiriciler, görünüm örneğini içeren bir bağlam sözlüğü, geçirilir:

view = self.context['view'] 
profile_id = int(view.kwargs['profile_id']) 

Ancak bu durumda, 'obj' ifadesinin her durumda profil örneğine ayarlanması gerektiğini düşünmüyorum.

Ve evet, yerine 'get_this_score' yöntemini model sınıfına koyabilirsiniz. Yine de, 'SerializerMethodField' 'a ihtiyacınız var, ancak' return obj.get_this_score (...) 'dizgesini, herhangi bir argümanı seri hale getirici bağlamından ayarlayalım.

Diziselleştirici içeriğinin de 'istek' içereceğini unutmayın, bu nedenle gerekirse 'request.user' öğesine de erişebilirsiniz.

+1

Modellere sahip olma fikrini beğeniyorum. ama SerializerMethodField kullanarak source = bana paristen geçmeme izin vermiyor. SerializerMethodField kullanarak ve istek kodları artı nesnesi bir model yöntemine geçirerek bana bir örnek verebilir misiniz? Bu gerçekten anlamama yardımcı olur. Teşekkürler. – jason

+0

@jason –

+0

'un sorusuna katılıyorum' Ancak bu durumda 'obj' 'profil örneğine' 'herhangi bir durumda' 'olarak ayarlamanız gerektiğini düşünmüyorum' Ürün 'örneğini mi kastediyorsunuz? – Pynchia

7

Jason'un Tom'un yanıtına verdiği yanıtı yanıtlamak için, istek nesnesine, benzer içerik mekanizmasıyla erişebilirsiniz. ModelMethod tanımından gelen istek nesnelerine başvurursanız, bunları geçemezsiniz. Şu anki request.user nesnesine aşağıdaki gibi erişmek için kullanabildim:

class ProductSerializer(serializers.ModelSerializer): 
    score = serializers.SerializerMethodField('get_this_score') 

    class Meta: 
     model = Product 
     fields = ('id', 'title', 'active', 'score') 

    def get_this_score(self, obj): 

     profile = self.context['request'].user 
     score = [val for val in obj.attribute_answers.all() if val in profile.attribute_answers.all()] 
     return (len(score)) 
+0

Teşekkürler, çözümleriniz bana çalışır! –

+0

Bu serileştirici CBV ile çalışırken, iyi çalışıyor ancak bu serileştiriciyi FBV 'return Response ({'data': ProductSerializer (user_profiles, çok = True) .data} ile kullandığımda keyerror isteğini alıyorum –

+0

[Ekstra bağlam dahil] (http://www.django-rest-framework.org/api-guide/serializers/#including-extra-context) –

İlgili konular