【问题标题】:Django Rest Framework: Validation not working when setting a "validator" inside the model fieldDjango Rest Framework:在模型字段中设置“验证器”时验证不起作用
【发布时间】:2020-06-10 06:39:42
【问题描述】:

我为任务创建了一个简单的模型,“天”字段应该是一个从 0 到 6 的整数列表,具体取决于任务应该在一周中的哪几天完成。例如星期一、星期三和星期五将是 1,3,5

class Task(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=255)
    time = models.TimeField()
    days = models.CharField(validators=[int_list_validator], max_length=16, blank=True)

序列化器如下所示:

class TaskCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task
        fields = ['name', 'time', 'days']

视图看起来像这样:

class TaskCreateAPI(CreateAPIView):
    serializer_class = TaskCreateSerializer

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)

当我在“天”字段中使用一些无效数据发出 POST 请求时,它不会引发任何错误:

{
  "name": "Laundry",
  "time":"22:30",
  "days":"not an integer list"
}

如何验证我的 API 请求?如果在我执行 POST 请求时未验证模型字段,那么在模型字段中添加验证有什么意义?

【问题讨论】:

    标签: django django-models django-rest-framework


    【解决方案1】:

    序列化程序以explained in the documentation 的形式从模型表单中接管验证。如果您实例化模型并保存它,您的验证器也不会被调用,这在信号处理程序和管理命令中很常见。模型验证器仅在调用 ModelInstance.clean() 时运行。

    您真的应该问自己为什么要将整数数组存储在 char 字段中。如果你正确地对其进行规范化,你可以查询“星期三的所有任务”,这对于像这样的非规范化字段来说要困难得多。

    class WeekDayChoices(IntegerChoices)
        monday = 0
        tuesday = 1
        wednesday = 2
        thursday = 3
        friday = 4
        saturday = 5
        sunday = 6
    
    class WeekDay(models.Model):
        day = models.SmallIntegerField(choices=WeekDayChoices, primary_key=True)
    
    class Task(models.Model):
        user = models.ForeignKey(User, on_delete=models.CASCADE)
        name = models.CharField(max_length=255)
        time = models.TimeField()
        days = models.ManyToManyField(WeekDay, ...)
    
    class WeekDaySerializer(serializers.ModelSerializer):
        class Meta:
            model = WeekDay
            fields = ["day"]
    
    class TaskSerializer(serializers.ModelSerializer):
        days = WeekDaySerializer(many=True)
        class Meta:
            model = Task
            fields = ['name', 'time', 'days']
    

    现在您不需要模型验证器,您可以轻松查询任务天数,并且您的 ModelSerializer 会自动接受整数列表作为唯一有效输入。

    【讨论】:

      猜你喜欢
      • 2015-12-10
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 2015-12-15
      • 2020-02-08
      相关资源
      最近更新 更多