我有一个与自身有递归关系的模型:
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对象。你可以说我将它用作只写字段。
这看起来有点笨拙。有没有更好的方法呢?
答案 0 :(得分:2)
好的,有两点:
您是否尝试将PrimaryKeyRelatedField用于original_id
?它似乎专门针对您的用例。结合depth option,它可以为您提供所需的一切。
您可以通过覆盖视图中的get_serializer_class()
来切换序列化程序(例如,基于请求方法)。不确定你是否会在这里得到你想要的确切行为。