【发布时间】:2019-08-26 22:59:40
【问题描述】:
我知道这个问题已经被问过很多次了,但我仍然无法找到正确的解决方案。假设我有类似跟随的模型
class Student(models.Model):
number = models.IntegerField()
department = models.ForeignKey(Department, on_delete=models.CASCADE)
class Meta:
constraints = [
models.UniqueConstraint(fields=['department', 'number'])
]
我的序列化器看起来像跟随。
class StudentModelSerializer(serializers.ModelSerializer):
class Meta:
model = Student
fields = ("number",)
在这个模型中department 和number 是unique together,现在部门是从pk 获取的,传入url。我处理独特错误的方式如下。
class StudentViewSet(ModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentModelSerializer
def perform_create(self, serializer):
department = Department.objects.get(pk=self.kwargs['pk'])
serializer.save(department=department)
def create(self, request, *args, **kwargs):
try:
return super().create(request, *args, **kwargs)
except IntegrityError as err:
if 'UNIQUE constraint' in err.message:
raise ValidationError({
'number': 'Number field should be unique.'
})
else:
raise IntegrityError(err)
如上所示,我调用super().create() 捕获异常,然后检查UNIQUE 消息是否存在,如果存在,我将再次引发验证错误,因此rest framework's exception handler 处理它。如果不是,我再次提出错误。
这种方法的问题是我正在检查消息 UNIQUE 的唯一错误,这可能会在未来发生变化。当然我可以在保存之前将部门添加到 serializer context 和 validate,但这可能会导致 @ 987654334@,那么best practice是什么来处理这种情况的呢?
【问题讨论】:
-
你能显示 url 配置吗?
-
结束网址应该是这样的
[POST] http://localhost/departments/{pk}/students -
在下面查看我的答案:)
标签: python django django-models django-rest-framework