【问题标题】:Get post data from CustomField in django rest framework从 django rest 框架中的 CustomField 获取发布数据
【发布时间】:2017-06-03 01:19:39
【问题描述】:

简而言之: 我有一个序列化程序(django rest 框架),它有两个自定义字段,它们不直接对应于我的模型的一个字段,并且也有不同的名称。 to_internal_value() 方法(可能)有效,但我不知道如何访问这些字段的发布数据。

如果您需要有关我的案例的更多详细信息:

我有一个看起来像这样的 django 模型:

class Requirement(models.Model):
    job         = models.ForeignKey('Job', related_name = 'requirements')
    description = models.CharField(max_length = 140)
    is_must_have = models.BooleanField() # otherwise is of type b

class Job(models.Model):
    ...

我想以这样的方式序列化它,作业对象如下所示:

{ "must_have": [must have requirements], "nice:to_have": [nice to have requirements] }

因此,我的序列化程序中有用于作业的自定义字段:

class JobSerializer(serializers.Serializer):
    nice_to_have = NiceToHaveField(source = 'requirements', allow_null = True)
    must_have = MustHaveField(source = 'requirements', allow_null = True)

NiceToHaveField 和 MustHaveField 类简单地覆盖了 to_representation() 和 to_internal_value() 方法,to_representation 也将需求排序在类型之后。 但是 JobSerializer.create 中的 validated_data 永远不会包含这些自定义字段。我知道 to_internal_value 被调用并完成其工作,但结果不可访问。

有什么办法解决这个问题?

【问题讨论】:

    标签: django-rest-framework


    【解决方案1】:

    我找到了一个我不喜欢的解决方案,可能有更好的方法来做到这一点。无论如何,数据在 view.request.data 中可用。所以我像这样使用了 perform_create 钩子:

    def perform_create(self, serializer):    
        nice_to_have = None
        must_have = None
        if 'nice_to_have' in self.request.data and self.request.data['nice_to_have'] != None:
            field = NiceToHaveField()
            nice_to_have = field.to_internal_value(self.request.data['nice_to_have'])
    
        if 'must_have' in self.request.data and self.request.data['must_have'] != None:
            field = MustHaveField()
            must_have = field.to_internal_value(self.request.data['must_have'])
    
        serializer.save(owner = self.request.user, nice_to_have = nice_to_have, must_have = must_have)      
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-25
      • 1970-01-01
      • 2015-12-07
      相关资源
      最近更新 更多