从fronside进行POST的问题。方法默认情况下不支持可写的点源字段

时间:2019-05-07 18:07:09

标签: django django-rest-framework django-serializer

我在序列化器中创建了一些点缀源字段。我这样做是因为必须显示外键的名称值而不是pk值。但是,当我尝试从前端djang进行POST时,抛出此错误:/ api / my-api /中的AssertionError .create()方法默认情况下不支持可写的点源字段。 为序列化程序.create()编写一个显式的MySerializer方法,或在点源序列化程序字段上设置read_only=True

因此,当我从前端设置read_only = True的POST时,要求从点源序列化程序字段中的每个字段请求null。

这是我的序列化器:

class FcaWorksSerializer(serializers.ModelSerializer):
    fell_form = serializers.CharField(source="fell_form.name" )
    #...
    main_type = serializers.CharField(source="main_type.name")

    class Meta:
        model = FcaWorks
        fields = ('id_fca','wkod', 'main_type','fell_form','fell_type','kind',\
        'sortiment','vol_drew','use_type','fca_res','ed_izm','vol_les','act_name',\
        'obj_type','use_area','indicator','comment','date_report')

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

覆盖序列化程序的 __init__() 方法以调整序列化程序条件

class FcaWorksSerializer(serializers.ModelSerializer):
    fell_form = serializers.CharField()
    # ...
    main_type = serializers.CharField()

    class Meta:
        model = FcaWorks
        fields = ('id_fca', 'wkod', 'main_type', 'fell_form', 'fell_type', 'kind',
                  'sortiment', 'vol_drew', 'use_type', 'fca_res', 'ed_izm', 'vol_les', 'act_name',
                  'obj_type', 'use_area', 'indicator', 'comment', 'date_report')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if self.context['request'].method == 'GET':
            self.fields['fell_form'].source = "fell_form.name"
            self.fields['main_type'].source = "main_type.name"

    def create(self, validated_data):
        # here you will get the data
        fell_form = validated_data['fell_form']
        main_type = validated_data['main_type']

答案 1 :(得分:0)

docs,有多种方法可以处理ForeignKey 关系。如果外键关系不是“多对多”,则不必创建自己的创建方法。 在您的情况下,您可以使用以下方法之一:

  • SlugRelatedField

  • PrimaryKeyRelatedField

      class FcaWorksSerializer(serializers.ModelSerializer):
          fell_form = serializers.SlugRelatedField(slug_field="name", queryset = ***"""The queryset that fell_form came from"""*** )
          #...
          main_type = serializers.SlugRelatedField(slug_field="name", queryset = ***"""The queryset main_type came from"""***)
    
          class Meta:
              model = FcaWorks
              fields = ('id_fca','wkod', 'main_type','fell_form','fell_type','kind',\
              'sortiment','vol_drew','use_type','fca_res','ed_izm','vol_les','act_name',\
              'obj_type','use_area','indicator','comment','date_report')
    

然后PrimaryKeyRelated Field用法:

 class FcaWorksSerializer(serializers.ModelSerializer):
        fell_form = serializers.PrimaryKeyRelatedField(source ="fell_form.name", queryset = ***"""The queryset that fell_form came from"""*** )
        #...
        main_type = serializers.PrimaryKeyRelatedField(source="main_type.name", queryset = ***"""The queryset main_type came from"""***)

当我遇到同样的问题时,这对我有用,但是就像之前针对“多对多”字段所述的那样,您必须明确编写创建和更新方法。