Ich habe Probleme beim Erstellen eines Objekts mit einer OneToOneField Referenz nach ID. Beispiel meines Code:Django Rest Framework: Angeben eines OneToOneField nach ID beim Erstellen eines Objekts über ModelViewSet
models.py
class Person(models.Model):
name = models.CharField(length=50)
class ExtraInfo(models.Model):
person = models.OneToOneField(
Person,
related_name='+',
primary_key=True,
on_delete=models.CASCADE
)
info = models.CharField(length=50)
serializers.py
class ExtraInfoSerializer(serializers.ModelSerializer):
class Meta:
model = models.ExtraInfo
views.py
class ExtraInfoView(viewsets.ModelViewSet):
queryset = models.ExtraInfo.objects.all()
serializer_class = serializers.ExtraInfoSerializer
urls.py
...
api_router = DefaultRouter()
api_router.register(r'extrainfo', ExtraInfoView)
url_patterns = [
url(r'/', include(api_router.urls))
]
...
Nun, wenn ich ein GET/extrainfo tun/ich etwas entlang der Linien von:
{
"count": 2,
"next": null,
"previous": null,
"results": [
{
"person": 1,
"info": "foo"
},
{
"person": 2,
"info": "bar"
}
]
}
Das ist also alles gut - genau das, was ich erwarte. Das Problem kommt, wenn ich versuche, einige Extrainfo zu erstellen, wenn ich/extrainfo POST/mit einem Körper wie:
{
"person": 3,
"info": "blah"
}
bekomme ich folgende Fehlermeldung:
ValueError: Cannot assign "3": "ExtraInfo.person" must be a "Person" instance.
So verstehe ich, was es sagt - Wenn ich das in maßgeschneidertem Code mache, würde ich etwas wie ExtraInfo.objects.create (person_id = 3, info = "blah") machen wollen. Ich kann einfach nicht herausfinden, wie ich mich so verhalten soll, wie ich es möchte.
Ich sehe this answer und ich kann nicht herausfinden, wo ich falsch liege. Ich scheine um es in der Lage sein zu arbeiten, indem sie, diese zu meinen Serializer:
def create(self, validated_data):
validated_data['person_id'] = validated_data['person']
del validated_data['person']
return super(ExtraInfoSerializer, self).create(validated_data)
Aber dies scheint nicht wie der beste Weg, es zu tun. Ich habe das Gefühl, dass ich entweder etwas Kleines verpasst habe oder etwas grundsätzlich falsch verstehe, aber so oder so finde ich es komisch, dass es auf den Primärschlüssel für das GET serialisiert wird, es aber nicht ähnlich im POST verwendet. Jede Hilfe würde sehr geschätzt werden.
Der POST-Körper ist JSON, es ist nicht Python-Code - man kann Person.objects.get nicht aufrufen. –
Dieses Problem kann durch 'related_name = +' verursacht werden. Wenn möglich, definieren Sie etwas anderes (zB 'related_name = 'extra_info') oder lassen Sie es undefiniert, so dass es den Standardwert annimmt. Dies könnte den Verknüpfungsprozess beeinträchtigt haben. Hilft es? – DurgaDatta
Hmm, nein, es scheint keinen Unterschied zu machen. –