2017-02-20 2 views
4

Speichern ich folgendes tun:django ruhen Daten zu Serializer hinzufügen, wenn

models.py

class MyModel(TimeStampedModel, models.Model): 
    name = models.CharField(max_length=100) 
    owner = models.ForeignKey(settings.AUTH_USER_MODEL) 

serializers.py

class MyModelSerializerCreate(serializers.ModelSerializer): 

    class Meta: 
     model = MyModel 
     fields = (
      'name', 
     ) 

Und ich möchte hinzufügen, als Eigentümer der aktuelle Benutzer in request.user. Momentan füge ich dies in meiner Ansicht direkt hinzu, indem ich request.data mit dem Benutzer auflade und dann die aktualisierten Daten an meinen Serializer übergebe.

data = request.data 
    # Add owner to data 
    data["owner"] = request.user.pk 
    serializer = self.get_serializer(data=data) 
    serializer.is_valid(raise_exception=True) 
    self.perform_create(serializer) 
    headers = self.get_success_headers(serializer.data) 

Ich mag würde dies direkt in meinem Serializer tun, aber nicht einen Weg finden kann richtig es tun, weil es wie die Datenüberprüfung zu mir aussieht. Ist das eine gute Idee? Soll ich diese Logik in meinen Ansichten beibehalten oder sie in meinen Serializer verschieben?

Antwort

7

Sie können einen Benutzer aus Serializer Kontext erhalten:

self.context['request'].user
Aus einer Methode übergeben get_serializer_context, die in einem ursprünglich erstellt GenericAPIView:

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

Innerhalb eines Serializer Sie eine create Methode außer Kraft setzen müssen :

class MyModelSerializerCreate(serializers.ModelSerializer): 

    class Meta: 
     model = MyModel 
     fields = ('name',) 

    def create(self, validated_data): 
     validated_data['owner'] = self.context['request'].user 
     return super(MyModelSerializerCreate, self).create(validated_data) 

Sie könnten überschreiben auch eine update und delete Methoden, wenn Sie einige spezielle Interaktionen mit user Modell benötigen.

+0

Hum das sieht gut aus, aber es überschreibt die erstellen Funktion des ModelSerializer die tut eine Menge Dinge wie zum Beispiel many_to_many Beziehung verwalten. Es wäre cool, wenn ich meinen Benutzer direkt in valided_data –

+0

@ v.thorey setzen könnte, so dass Sie "valided_data" aktualisieren und dann 'super' aufrufen könnten, um alle Standardverhalten bereitzustellen, oder Sie könnten' perform_create' in Ihrer Ansicht verwenden. Ich werde meine Antwort aktualisieren –

+0

Hum in der Tat das ist schlau :) danke –

1

Unfortunatly nicht, daß ich den Ruf Punkte zu kommentieren @ ivan-Semochkin Beitrag oben, sollte aber die letzte Zeile nicht sein:

return super(MyModelSerializerCreate, self).create(validated_data) 
Verwandte Themen