从django rest framework

时间:2017-01-18 15:26:59

标签: django-rest-framework

简而言之: 我有一个序列化程序(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从不包含这些cutom字段。我知道to_internal_value被调用并完成它的工作,但结果是不可访问的。

解决这个问题的方法是什么?

1 个答案:

答案 0 :(得分: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)