Django DRF PrimaryRelatedField何时写入,NestedSerializer何时读取?

Django DRF PrimaryRelatedField何时写入,NestedSerializer何时读取?,django,django-rest-framework,Django,Django Rest Framework,我使用的是嵌套序列化程序。我需要 PrimeSerialIsI/返回完整相关的 Project < /Cord>对象,以获取请求,并只考虑ID切换(更改当前),如在“代码> PrrrExeSerialIs< /C>”上的POST/PUT请求相关的基本字段行为。如何实现这一目标,有什么解决方案吗 class ProfileSerializer(serializers.ModelSerializer): current = ProjectSerializer() class Meta

我使用的是嵌套序列化程序。我需要<代码> PrimeSerialIsI/<代码>返回完整相关的<代码> Project < /Cord>对象,以获取请求,并只考虑ID切换(更改当前),如在“代码> PrrrExeSerialIs< /C>”上的POST/PUT请求相关的基本字段行为。如何实现这一目标,有什么解决方案吗

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

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


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

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


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

正如Linova所提到的,不使用第三方库解决此问题的最简单方法是在序列化程序中声明两个单独的字段。您的嵌套序列化程序
current
将保持不变,但您将添加一个新的
PrimaryKeyRelatedField
序列化程序。嵌套序列化程序应为只读,但相关字段不会为只读。我通常按照惯例命名相关字段
\u id

在GET请求中,嵌套序列化程序和
id
字段都将返回,但对于PUT或POST请求,只需要指定
\u 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')

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

在GET请求中,嵌套序列化程序和
id
字段都将返回,但对于PUT或POST请求,只需要指定
\u 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')

您将如何称呼该字段(当前_id)?您是否认为没有更干净的方法来实现这一点,比如向嵌套序列化程序字段添加属性,告诉他们在需要时切换到priamryrelatedfield?是的,这可能会有不同的读写行为。iirc,有第三方软件包()但是我们建议不要避免不一致。@Linovia“不要避免不一致”。向上投票三重否定。您如何称呼该字段(当前id)?您是否认为没有更干净的方法来实现这一点,比如向嵌套序列化程序字段添加属性,告诉他们在需要时切换到priamryrelatedfield?是的,这可能会有不同的读写行为。iirc,有第三方软件包()但是我们建议不要避免不一致。@Linovia“不要避免不一致”。向上投票三重否定。您不需要
ProjectSerializer
上的
read\u only=True
吗?您不需要
ProjectSerializer
上的
read\u only=True