2016-05-17 36 views
7

request.data aracılığıyla ayarlanmamış alanların değerlerini ayarlamak için bir serileştiriciye ek args/kwargs sağlamak için Django REST Framework'de oldukça standart bir görevdir, ancak URL parametreleri veya çerezlerdeki değer aracılığıyla. Örneğin, POST isteği üzerine request.user'a eşit olan Yorum modelimin user alanını ayarlamam gerekiyor. Bu ek argümanlara bağlam denir. StackOverflow'dakiDjango REST Framework: serializer içeriğinin nasıl çalışır?

Çeşitli sorular (1, 2) Benim ModelViewSet ait get_serializer_context() yöntemini geçersiz olduğunu göstermektedir. Yaptım ve yardım etmiyor. Neyin yanlış olduğunu anlamaya çalıştım ve kaynak koddan anlamamadığımı, bu bağlam sisteminin genel olarak nasıl çalışması gerektiğini öğrendim. (bu konudaki belgeler de eksiktir)

Diziselleştiricinin normal istek verilerine bağlam eklediği yerlerde herhangi biri açıklanabilir mi? Değerleri bağlamdan kaydettiği iki yer buldum.

  1. serializer.save(), onaylanmış veri kwargs karışımları yöntem olup, ancak genelde (örneğin ModelMixins) tarafından herhangi bir bağımsız değişken olarak adlandırılır. fields.__new__(), hangi önbellekler ve kwargs önbellekleri, ama kimse daha sonra onları okur gibi görünüyor. Eğer jenerik görüş ve viewsets her kullandığınızda

cevap

7

, DRF (3.3.2) request nesne view nesne ve seri hale context için format ekler. Erişim için serializer.context'u kullanabilirsiniz, serileştiricide request.user diyelim.

Bu, get_serializer_class() çağrıldığında eklenir. İçerisinde, tüm bu parametrelerin içeriğine eklendiği get_serializer_context() yöntemini çağırır. referans için

DRF kaynak kodu:

class GenericAPIView(views.APIView): 
    """ 
    Base class for all other generic views. 
    """ 

    def get_serializer(self, *args, **kwargs): 
     """ 
     Return the serializer instance that should be used for validating and 
     deserializing input, and for serializing output. 
     """ 
     serializer_class = self.get_serializer_class() 
     kwargs['context'] = self.get_serializer_context() 
     return serializer_class(*args, **kwargs)  

    def get_serializer_context(self): 
     """ 
     Extra context provided to the serializer class. 
     """ 
     return { 
      'request': self.request, 
      'format': self.format_kwarg, 
      'view': self 
     } 
+0

O kadar çok düşündüm, ama sonra ne olacak? Serializer'ın alanlardan aldığı değerleri alanlarla doldurmak için bu bağlamı kullandığı yeri göremiyorum. –

+0

Normal durumlarda, içerik bir serileştirici tarafından kullanılmayacaktır. Diziselleştiricide 'request' nesnesine erişmek istiyorsak,' self.context.get ('request') 'ifadesini kullanacağız. Ayrıca, herhangi bir serileştirici alanın 'to_representation' yönteminde' self.context' değişkenini kullanarak 'context' öğesine erişebiliriz. –

+0

([docs] 'dan (http://www.django-rest-framework.org/api-guide/serializers/#including-extra-context) "Bağlamı dahil etmenin ortak bir örneği" Köprüsüz ilişkileri içeren seri hale getirici, diziselleştiricinin geçerli talebe erişmesini ve böylelikle tam olarak kaliteli URL'ler oluşturabilmesini gerektirir. –

0

alanların değerleri request.data yoluyla değil ayarlanır, ancak url parametreleri veya kurabiye değeri üzerinden ayarlamak için. Örneğin, Yorum modelimin kullanıcı alanını POST isteği üzerine request.user öğesine ayarlamam gerekiyor. Benim ModelViewSet hem davalarını nasıl budur

:

def perform_create(self, serializer): 

    # Get article id from url e.g. http://myhost/article/1/comments/ 
    # obviously assumes urls.py is setup right etc etc 
    article_pk = self.kwargs['article_pk'] 
    article = get_object_or_404(Article.objects.all(), pk=article_pk) 

    # Get user from request 
    serializer.save(author=self.request.user, article=article) 

Maalesef yuvalanmış nesneler DRF için standart değil ama bu noktada dışında bulunuyor. :)

İlgili konular