我为任务创建了一个简单的模型,"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
会自动接受整数列表作为唯一有效的输入。