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?