使用Django REST框架序列化/反序列化的不同序列化程序

时间:2013-09-30 22:26:07

标签: python django django-rest-framework

我有一个与自身有递归关系的模型:

class Tweet(models.Model):
    text = models.CharField(max_length=140)
    original = models.ForeignKey("self", null=True, blank=True)

一个串行器,它将原始的Tweet内联呈现:

class TweetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tweet
        fields = ('id', 'text', 'original', 'original_id')

    original_id = serializers.IntegerField(source='original_id', required=False)

    def to_native(self, obj):
        ret = super(TweetSerializer, self).to_native(obj)
        del ret['original_id']
        return ret

TweetSerializer.base_fields['original'] = TweetSerializer(source='original', read_only=True)

正如您所看到的,我还在to_native中删除了一个original_id字段。 original_id的目的是允许我设置新推文的original_id,而不是必须向original字段提供完整的Tweed对象。你可以说我将它用作只写字段。 这看起来有点笨拙。有没有更好的方法呢?

1 个答案:

答案 0 :(得分:2)

好的,有两点:

  1. 您是否尝试将PrimaryKeyRelatedField用于original_id?它似乎专门针对您的用例。结合depth option,它可以为您提供所需的一切。

  2. 您可以通过覆盖视图中的get_serializer_class()来切换序列化程序(例如,基于请求方法)。不确定你是否会在这里得到你想要的确切行为。