在Django的REST框架串行

在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与列“主题”

我应该如何动态设置序列化器中的字段值?

+0

你如何从请求用户获取主体价值或通过您的要求参数 – Robert

+0

@罗伯特也许我在缩短我的代码的时候让你有点困惑。我再次编辑它,当用户请求POST – Kari

+0

获得subject_vaule时,您需要将该值赋给subject_key,从request.data中获得subject_value? – Robert

声明中串作为法领域的学科领域,它总是只读(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