1

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

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)

如您所见,我还有一个 original_id 字段已在to_native. 的目的是允许我设置新推文的 original_id,而不必向该字段original_id提供完整的 Tweed 对象。original您可以说我将其用作只写字段。不过,这似乎有点笨拙。有更好的方法吗?

4

1 回答 1

2

好的,两点:

  1. 您是否尝试过使用PrimaryKeyRelatedField为您的original_id?它似乎专门针对您的用例。结合深度选项,它可以为您提供所需的一切。

  2. get_serializer_class()您可以通过覆盖您的视图来切换序列化程序(例如,基于请求方法) 。不确定您是否会在此处获得所需的确切行为。

于 2013-10-01T12:35:40.793 回答