在Django的REST框架串行
问题描述:
我要在数据库中创建一个新的记录如何自定义字段,我将像下面的模型:在Django的REST框架串行
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与列“主题”
我应该如何动态设置序列化器中的字段值?
答
声明中串作为法领域的学科领域,它总是只读(serializermethodfield),你可以为你的申请例如:在这种方式,您将有树域在seriaizer 'subject', 'subject_key', 'var_subject'
class FooSerializer(serializers.ModelSerializer):
class Meta:
model = FooModel
def get_var_subject(self, obj):
也可以将您mehod添加到模型,并使用to_representation
def to_representation(self, instance):
representation = super(FooSerializer, self).to_representation(instance)
representation['subject'] = instance.get_subject()
return representation
或使用f提起ield to_representation例如相关,但我希望你可以用它
,或者您需要重写save
方法
答
你可以试试这个
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
你如何从请求用户获取主体价值或通过您的要求参数 – Robert
@罗伯特也许我在缩短我的代码的时候让你有点困惑。我再次编辑它,当用户请求POST – Kari
获得subject_vaule时,您需要将该值赋给subject_key,从request.data中获得subject_value? – Robert