Django序列化器和嵌套对象

时间:2014-09-09 00:54:24

标签: python django serialization

我试图从一些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,但是在反序列化时我不会收到此错误?

1 个答案:

答案 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