我试图从一些JSON反序列化并保存一个对象。 我有一个看起来像这样的对象:
class Item(models.Model):
created_at = models.DateTimeField(default=utcnow)
category = models.ForeignKey(Category, related_name='items')
class Category(models.Model):
name = models.CharField(max_length=140, unique=True)
description = models.TextField(default='', blank=True)
created_at = models.DateTimeField(default=utcnow)
现在,我为这些对象定义了序列化器,如下所示:
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = EventCategory
fields = (
'id',
'name',
'description'
)
class ItemSerializer(serializers.ModelSerializer):
created_at = serializers.DateTimeField()
category = CategorySerializer()
class Meta:
model = Event
fields = (
'id',
'created_at',
'category',
)
这个数据结构的一点点时髦之处在于'类别'对象不需要改变,我也不想创建任何新对象 - 我已预先定义了一堆这些对象,它们基本上表达了'类型'我们正在处理的项目。我们不会保存,更新或添加新的。
好的,现在假设我有一个看起来像这样的Item的JSON表示:
{'category': {'id': 1, 'name': 'some_name', 'description': 'some_description}, 'id': 101, 'created_at': date_info}
我想创建并保存Item对象,但不想创建新的类别对象。如果我这样做:
serializer = ItemSerializer(data=data)
if serializer.is_valid():
serializer.save()
它抱怨我违反了类别名称字段中的unique = True约束。我假设序列化程序也将保存操作传播到类别。我的问题:如何定义我的序列化程序,以便在序列化时可以读出类别JSON,但是在反序列化时我不会收到此错误?
答案 0 :(得分:0)
您可以拥有两个序列化程序,每个操作一个。然后,在您的视图集上添加一个在它们之间正确选择的函数:
class StuffReadSerializer (...)
class StuffWriteSerializer (...)
class StuffViewSet(viewsets.ModelViewSet):
model = Stuff
def get_serializer_class(self):
if self.request.method == 'GET':
return StuffReadSerializer
return StuffWriteSerializer