来自前端的 POST 问题。默认情况下,方法不支持可写的点源字段
Problem with POST from fronside. Method does not support writable dotted-source fields by default
我在我的序列化程序中创建了一些点状源字段。我这样做是因为必须显示外键的名称值而不是 pk 值。但是当我尝试从前端 djang POST 抛出这个: /api/my-api/ 的 AssertionError
默认情况下,.create()
方法不支持可写的点源字段。
为序列化程序 MySerializer
编写显式 .create()
方法,或在点源序列化程序字段上设置 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')
我该如何解决这个问题?
覆盖序列化器的__init__()
方法调整序列化器条件
class FcaWorksSerializer(serializers.ModelSerializer):
<b>fell_form = serializers.CharField()</b>
# ...
<b>main_type = serializers.CharField()</b>
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')
<b>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']</b>
从docs开始,有多种方法可以处理外键关系。如果外键关系不是“多对多”,则不必创建自己的创建方法。
在您的情况下,您可以使用以下方法之一:
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')
然后PrimaryKey相关字段用法:
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"""***)
当我遇到同样的问题时,这对我有用,但是就像之前针对“多对多”字段所述,您必须明确编写创建和更新方法。
我在我的序列化程序中创建了一些点状源字段。我这样做是因为必须显示外键的名称值而不是 pk 值。但是当我尝试从前端 djang POST 抛出这个: /api/my-api/ 的 AssertionError
默认情况下,.create()
方法不支持可写的点源字段。
为序列化程序 MySerializer
编写显式 .create()
方法,或在点源序列化程序字段上设置 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')
我该如何解决这个问题?
覆盖序列化器的__init__()
方法调整序列化器条件
class FcaWorksSerializer(serializers.ModelSerializer):
<b>fell_form = serializers.CharField()</b>
# ...
<b>main_type = serializers.CharField()</b>
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')
<b>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']</b>
从docs开始,有多种方法可以处理外键关系。如果外键关系不是“多对多”,则不必创建自己的创建方法。 在您的情况下,您可以使用以下方法之一:
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')
然后PrimaryKey相关字段用法:
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"""***)
当我遇到同样的问题时,这对我有用,但是就像之前针对“多对多”字段所述,您必须明确编写创建和更新方法。