我有此代码用于评级课程,用户和课程应自动从请求授权和URL添加:
#views.py
class RatingViewSet(
mixins.ListModelMixin,
mixins.CreateModelMixin,
viewsets.GenericViewSet
):
permission_classes = [permissions.IsAuthenticated]
serializer_class = RatingSerializer
def perform_create(self, serializer):
lessonInstance = Lesson.objects.get(id = self.kwargs['lessonID'])
serializer.save(user=self.request.user, lesson = lessonInstance)
def get_queryset(self):
lessonID = self.kwargs['lessonID']
return Rating.objects.filter(user=self.request.user, lesson=lessonID)
#serializers.py
#models.py
class Rating(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL)
lesson = models.ForeignKey('lessons.Lesson')
difficulty = models.IntegerField()
class meta:
unique_together('user','lesson')
我希望每个用户/课程最多有1个等级,因此unique_together('user','lesson')
。但是有一个问题:只要代码中有这个约束,没有user
或lesson
字段的请求就会被拒绝,并出现field required
错误,即使它们是read_only
。在
(如果我使用unique_together('user','lesson')
进行迁移,那么删除它可以工作的那一行,但是一到那里我就得到错误。)
我希望保留这段代码,这样就不会在以后的迁移中意外地删除unique_together
约束。在
这是一个需要不同方法的特殊情况。以下是
django-rest-framework
documentation(见注释)对这个案例的描述:在您的例子中,您需要显式地定义}字段,如下所示:
user
和{祝你好运!在
如果一个字段是
read_only=True
,那么validated_data
将忽略它的数据=>;因为error required field
,请在doc阅读更多内容我也遇到了类似的问题,然后尝试了@iulian上面的答案,但没有成功! 不再支持此组合
read_only
+default
行为,请选中this我通过两种解决方案解决了这个问题:
解决方案1。编写自己的
^{pr2}$CurrentUserDefault
类以获取用户id,然后将其设置为序列化程序的默认属性数据(Ref from #51940976)解决方案2。重写序列化程序的create方法以设置用户id的数据(Ref fromthis)
我希望这有帮助!在
相关问题 更多 >
编程相关推荐