1

それ自体に再帰的な関係を持つモデルがあります:

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

元のツイートをインラインでレンダリングするシリアライザー:

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ます。の目的は、本格的な Tweed オブジェクトをフィールドoriginal_idに提供するのではなく、新しいツイートの original_id を設定できるようにすることです。original書き込み専用フィールドとして使用していると言えます。ただし、これは少し不格好に思えます。それを行うより良い方法はありますか?

4

1 に答える 1

2

わかりました、2点:

  1. にPrimaryKeyRelatedFieldを使用してみましたoriginal_idか? ユースケースを具体的にターゲットにしているようです。depth オプションと組み合わせると、必要なものがすべて得られる場合があります。

  2. ビューをオーバーライドすることで、(たとえば、リクエスト メソッドに基づいて) シリアライザーを切り替えることができget_serializer_class()ます。ただし、ここで必要な正確な動作が得られるかどうかはわかりません。

于 2013-10-01T12:35:40.793 に答える