如何正确覆盖序列化程序保存在DRF中的POST请求?

时间:2018-02-16 21:01:04

标签: django django-rest-framework

我有一个模型,它有一个DateTime字段和一个该模型的序列化器。我有一个仅用于创建模型对象的POST端点,但问题是对此端点的请求将发送完全不同的日期/时间格式,因此需要在保存之前在Django端重新格式化。

通常(没有DRF),我只是覆盖模型保存方法,但现在引入DRF,我很困惑,如果我应该覆盖模型或序列化器的保存方法?我在想是否覆盖模型的save方法,以便在保存之前重新格式化日期/时间值。然后serializer.is_valid()本身会在收到错误的日期时间格式时抛出错误,因为序列化程序直接映射到模型字段并且不知道模型的保存方法?

这样做的最佳方式是什么?

models.py

class Job(models.Model):
    name = models.CharField(max_length=150)
    age = models.CharField(max_length=200)
    start_time = models.DateTimeField()
    class Meta:
        unique_together = ('name', 'age', 'start_time')

serializers.py

class JobSerializer(serializers.ModelSerializer):
    name = serializers.CharField()
    age = serializers.CharField(required=False)
    start_time = serializers.CharField(required=False)
    class Meta:
        model = Job
        fields = ('name', 'age', 'start_time')

2 个答案:

答案 0 :(得分:2)

如Daniel所述,序列化程序应负责将您的内容数据类型(API数据)转换为提供给您的模型的本机数据类型,并且对该数据的任何修改或验证也应由序列化程序本身处理。

对于DRF序列化程序的验证,可以使用字段级验证和对象级验证来验证您的start_time字段。

字段级别验证->

def validate_start_time(self, value):
    #validation
    return value

对象级验证

def validate(self, data):
    #obj validation if required e.g want to combine some data into one or mix match
    return data

,并且可以改为使用序列化程序中的datetime字段,

 start_time = serializers.DateTimeField()

答案 1 :(得分:1)

您可以在字段级验证中包含输入值的格式。在序列化程序中包含以下方法:

def validate_start_time(self, value):
    # format value here
    return value

有关字段级验证的更多信息:http://www.django-rest-framework.org/api-guide/serializers/#field-level-validation