我想在数据库中创建一条新记录,我设置了如下模型:
class FooModel(models.Model)
subject_key= models.CharField(max_length=2)
subject= modeels.CharField(max_length=100)
我想要做的是:字段'subject_key'应该由客户端给出,并且使用subject_key,服务器将找到值'subject'并将其放入数据库。
所以我尝试使用ModelSerializer来创建新记录。
class FooSerializer(serializers.ModelSerializer):
class Meta:
model = FooModel
def get_subject(self, obj):
if obj.subject == 'SO':
return 'Stack Overflow'
else:
return 'Nothing in here'
和视图rest api中的主要运行代码是:
class FooView(APIView):
def post(self, request, *args, **kwargs):
serializer = FooSerializer(data=request.data)
if serializer.is_valid(raise_exception=True)
serializer.save()
foo = serializer.data
我检查了它在数据库中成功创建了一条新记录,但新记录为NULL,其中包含'subject'列
如何动态设置序列化程序中的字段值?
答案 0 :(得分:0)
您将序列化程序中的主题字段声明为方法字段,它始终只读(serializermethodfield),您可以重命名您的字段,例如:
class FooSerializer(serializers.ModelSerializer):
class Meta:
model = FooModel
def get_var_subject(self, obj):
通过这种方式,您的序列化程序'subject', 'subject_key', 'var_subject'
或者您可以将您的方法添加到模型中并使用to_representation
def to_representation(self, instance):
representation = super(FooSerializer, self).to_representation(instance)
representation['subject'] = instance.get_subject()
return representation
或者使用相关字段的to_representation字段示例,但我希望您可以使用它
或者您需要覆盖save
方法
答案 1 :(得分:0)
你可以试试这个
def post(self, request, *args, **kwargs):
request.data['subject_key'] = request.data['subject']
serializer = FooSerializer(data=request.data)
if serializer.is_valid(raise_exception=True)
serializer.save()
foo = serializer.data