我有一个模型,它有一个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')
答案 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