【问题标题】:how to properly override serializer save on a POST request in DRF?如何在 DRF 中的 POST 请求中正确覆盖序列化程序保存?
【发布时间】:2018-02-16 21:01:03
【问题描述】:

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

通常(没有 DRF),我只会覆盖模型的保存方法,但现在随着 DRF 的引入,我是否应该覆盖模型或序列化程序的保存方法?我在考虑是否覆盖模型的保存方法,以便在保存之前重新格式化日期/时间值。那么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')

序列化器.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')

【问题讨论】:

  • 你的推理很难理解。序列化程序应负责以模型期望的格式创建数据。这不是您应该更改的保存,而是字段验证-尽管我不明白您为什么使用 CharField 而不是 DateTimeField 以及相关的input_formats

标签: django django-rest-framework


【解决方案1】:

正如 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

并且可以使用序列化程序中的日期时间字段,

 start_time = serializers.DateTimeField()

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-29
      • 2021-05-09
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多