2
根據Django REST Framework版本3 documentation,爲了創建可寫入嵌套序列化器,您需要編寫自己的create()
和update()
方法。我有閱讀和寫作的工作,但更新不起作用。例如,如果我將以下數據發送到我的序列化器3次,我最終創建了3個新的Widget。我預計傳遞一個預先存在的id
會觸發更新並呼叫update()
,但是會調用create()
。似乎id
被忽略,這是有道理的,因爲它是自動生成的,所以我如何實現這一點?Django REST Framework嵌套序列化器不會更新
我有一種感覺,我錯過了一些明顯的東西,也許在我看來有些額外的處理?
views.py(目前確實粗糙,請原諒)
from rest_framework.decorators import api_view
from rest_framework.response import Response
from widget.models import Widget
from widget.serializers import WidgetSerializer
@api_view()
def create(request):
data = {
"id": 4,
"widget_alpha": {
"bits": [
{
"id": 3,
"name": "bit 1",
"widget": 4
}
],
"bobs": [
{
"id": 3,
"name": "bob 1",
"widget": 4
}
],
"name": "my wid",
"widget": 4
},
"language": "en",
"code": "123"
}
serializer = WidgetSerializer(data=data)
if serializer.is_valid():
serializer.save()
else:
print serializer.errors
return Response({"message": "yay"})
Widget是一個父模型,WidgetAlpha是一個孩子,是由幾個位和鮑勃的。下面的代碼相關的models.py
和serializers.py
。
models.py
from django.db import models
class Widget(models.Model):
LANGUAGE = (
('fr', 'French'),
('en', 'English'),
)
language = models.CharField(max_length=2, choices=LANGUAGE)
code = models.CharField(max_length=6)
class WidgetAlpha(models.Model):
widget = models.OneToOneField(Widget, primary_key=True, related_name='widget_alpha')
name = models.CharField(max_length=6)
class Bit(models.Model):
widget = models.ForeignKey(WidgetAlpha, related_name='bits')
name = models.CharField(max_length=6)
class Bob(models.Model):
widget = models.ForeignKey(WidgetAlpha, related_name='bobs')
name = models.CharField(max_length=6)
serializers.py
from rest_framework import serializers
from widget.models import Widget, WidgetAlpha, Bit, Bob
class BitsSerializer(serializers.ModelSerializer):
class Meta:
model = Bit
class BobsSerializer(serializers.ModelSerializer):
class Meta:
model = Bob
class WidgetAlphaSerializer(serializers.ModelSerializer):
bits = BitsSerializer(many=True)
bobs = BobsSerializer(many=True)
class Meta:
model = WidgetAlpha
class WidgetSerializer(serializers.ModelSerializer):
widget_alpha = WidgetAlphaSerializer()
class Meta:
model = Widget
def create(self, validated_data):
widget_alpha_data = validated_data.pop('widget_alpha')
bits_data = widget_alpha_data.pop('bits')
bobs_data = widget_alpha_data.pop('bobs')
widget = Widget.objects.create(**validated_data)
alpha_widget = WidgetAlpha.objects.create(widget=widget, **widget_alpha_data)
for bit_data in bits_data:
Bit.objects.create(widget=alpha_widget, **bit_data)
for bob_data in bobs_data:
Bob.objects.create(widget=alpha_widget, **bob_data)
return widget
def update(self, instance, validated_data):
# never get here :(
return instance
你可以添加你的看法呢? – DevilPinky
views.py已被添加 – redgoose
你不要在任何地方調用'update'。如果你想調用一個更新,你需要創建類似如下的串行器對象:'serializer = WidgetSerializer(object,data = data)' – DevilPinky