【问题标题】:DRF PrimaryRelatedField when write and NestedSerializer when read?写入时的 DRF PrimaryRelatedField 和读取时的 NestedSerializer?
【发布时间】:2017-08-07 14:03:05
【问题描述】:

我正在使用嵌套序列化程序。我需要ProfileSerializer 为获取请求返回完全相关的Project 对象,并只考虑id 切换(改变当前),就像在ProfileSerializer 上发布/放置请求的相关PrimaryField 行为一样。关于如何实现这一点的任何解决方案?

class ProfileSerializer(serializers.ModelSerializer):
    current = ProjectSerializer()
    class Meta:
        model = Profile
        fields = ('function', 'current')

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    正如 Linova 提到的,在不使用第三方库的情况下解决此问题的最简单方法是在序列化程序中声明两个单独的字段。您的嵌套序列化程序current 将保持不变,但您将添加一个新的PrimaryKeyRelatedField 序列化程序。嵌套的序列化器应该是只读的,但相关的字段不会是只读的。我通常按​​照约定将相关字段命名为<field>_id

    在 GET 请求中,嵌套序列化程序和 id 字段都将返回,但对于 PUT 或 POST 请求,只需指定 <field>_id

    class ProfileSerializer(serializers.ModelSerializer):
        current = ProjectSerializer(read_only=True)
        current_id = serializers.PrimaryKeyRelatedField(queryset=Projects.objects.all(), source='current')
        class Meta:
            model = Profile
            fields = ('function', 'current', 'current_id')
    

    【讨论】:

    • 您不需要ProjectSerializer 上的read_only=True 吗?
    【解决方案2】:

    我通常建议的最一致的方法是将所有嵌套序列化程序(在本例中为ProjectSerializer)标记为只读并将id 字段添加为read_only=False

    因此,您将在列表/检索和创建/更新之间保持一致。

    【讨论】:

    • 您如何称呼该字段 (current_id) ?你认为没有更简洁的方法来实现这一点,比如向嵌套的序列化器字段添加一个属性,告诉他们在需要时切换到 priamryrelatedfield ?
    • 是的,这可以有不同的读写行为。 iirc,有一个第三方包(django-rest-framework.org/topics/third-party-packages)但是我们建议不要避免不一致。
    • @Linovia “不是为了避免不一致”。支持三重否定。
    猜你喜欢
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多