2016-12-16 3 views
0

Ich habe Probleme bei der Übergabe zusätzlicher Attribute durch die Verwendung von Django Rest Framework mit verschachtelten Serialisierer.Übergeben von zusätzlichen Attributen den ganzen Weg durch verschachtelte Serialisierer

Ich habe ein Dokument Modell erstellt, das eine ForeignKey Besitzer/Schöpfer Beziehung hat, und mehrere andere ForeignKey verwandte Modelle. Einige dieser anderen Modelle haben einen Besitzer/Ersteller ForeignKey auch zugeordnet.

class Document(models.Model): 
    owner = models.ForeignKey('auth.User',related_name='document') 
    candidate = models.ForeignKey(
            Candidate, 
            on_delete=models.CASCADE, 
            blank=True, 
            null=True, 
           ) 

class Candidate(models.Model): 
    owner = models.ForeignKey('auth.User', related_name='candidates') 
    first_name = models.CharField(max_length=30, blank=True, null=True) 

Wenn das Dokument zu speichern unten Modell mit einem verschachtelten Serializer und einer benutzerdefinierten create() Methode, ich Sie alle Felder passieren kann, aber die verschachtelten Modelle scheinen nicht das Feld Besitzer abholen zu können, , egal wie ich es übergebe. Das Erstellen eines Kandidaten allein ist in Ordnung.

class CandidateSerializer(serializers.ModelSerializer): 
    owner = serializers.ReadOnlyField(source='owner.username') 
    class Meta: 
     model = Candidate 
     fields = (
       'pk', 
       'first_name', 
       'owner', 
      ) 

class DocumentSerializer(serializers.ModelSerializer): 
    owner = serializers.ReadOnlyField(source='owner.username') 
    candidate = CandidateSerializer(required=True) 
    class Meta: 
     model = Document 
     fields = (
        'owner', 
        'candidate', 
       ) 

    def create(self, validated_data): 
     candidate_data = validated_data.pop('candidate') 
     document = Document.objects.create(**validated_data) 
     Candidate.objects.create(**candidate_data) 

Mit DocumentSerializer wie dies einrichten, bekomme ich Fehler wie diese, während ein POST auf das Dokument mit verschachtelten Feldern zu tun versuchen.

IntegrityError: NOT NULL constraint failed: dossier_candidate.owner_id 

Wenn ich die DocumentSerializer.create() Methode ändern Sie den Besitzer, um zu versuchen zu holen, scheint es, dass owner = serializers.ReadOnlyField(source='owner.username') jetzt außerhalb des Bereichs ist, auch wenn es unter der Klasse sein sollte.

dh

Wenn ich versuche, mit

Candidate.objects.create(owner, **candidate_data) 

den Kandidaten-Objekt zu erstellen bekomme ich diesen Fehler:

NameError at /rest/documents/ 
global name 'owner' is not defined 

Wenn ich versuche, dieses

Candidate.objects.create(self.owner, **candidate_data) 

I Erhalte diesen Fehler:

AttributeError: 'DocumentSerializer' object has no attribute 'owner' 

Was ist die richtige Methode zu machen, dass das verschachtelte Candidate Objekt der Lage ist, erfolgreich erstellt werden, die Eigentümer Feld Abholung?

Antwort

0

Als erstes müssen Sie den Eigentümer nicht erstellen/aktualisieren, da er schreibgeschützt ist.

Wenn Sie den aktuellen Benutzer dafür erhalten möchten, verwenden Sie CurrentUserDefault. Es wird dem validated_data

hinzugefügt werden
Verwandte Themen