Django Rest 框架:在模型字段中设置"validator"时验证不起作用



我为任务创建了一个简单的模型,"days"字段应该是从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 请求时未对其进行验证,那么在模型字段中添加验证有什么意义?

序列化程序接管模型窗体的验证,如文档中所述。如果您实例化模型并保存它,您的验证器也不会被调用,就像信号处理程序和管理命令中常见的那样。模型验证程序仅在调用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会自动接受整数列表作为唯一有效的输入。

最新更新