写入时的DRF PrimaryRelatedField和读取时的NestedSerializer?

时间:2017-03-16 11:53:57

标签: django django-rest-framework

我正在使用嵌套的序列化程序。我需要ProfileSerializer为get请求返回完整的相关Project对象,并且只考虑id切换(更改当前),就像在ProfileSerializer上的post / put请求的relatedPrimaryField行为一样。关于如何实现这一目标的任何解决方案?

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

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