【问题标题】:Why Django's OneToOneField returns 500 if relation aready exists如果关系已经存在,为什么 Django OneToOneField 返回 500
【发布时间】:2022-01-25 20:11:33
【问题描述】:

在 Django REST Framework POST 视图中,如果 OneToOneField 关系已经存在,有什么方法可以避免 HTTP 500

相反,获得 HTTP 400 会很棒。

models.py

class Club(TimeStampModel):
    owner = models.OneToOneField(User, on_delete=models.PROTECT)
    name = models.CharField(max_length=255, unique=True)

serializers.py

class ClubSerializer(serializers.ModelSerializer):
    class Meta:
        model = Club
        fields = '__all__'
        read_only_fields = ['owner', 'active']

views.py

class ClubRegistrationView(generics.CreateAPIView):
    queryset = Club.objects.all()
    serializer_class = ClubSerializer
    permission_classes = [IsAuthenticated]

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

谢谢。

【问题讨论】:

  • 请分享您的模型、序列化程序和视图\视图集的代码
  • 好的,问题更新了!

标签: django django-rest-framework


【解决方案1】:

当您像这样通过owner 时,serializer.save(owner=self.request.user) 序列化程序不会执行验证。您应该为此重写 create 而不是 perform_create 方法


class ClubRegistrationView(generics.CreateAPIView):
    queryset = Club.objects.all()
    serializer_class = ClubSerializer
    permission_classes = [IsAuthenticated]

    def create(self, request, *args, **kwargs):
        request.data["owner"] = request.user.pk
        return super().create(request, *args, **kwargs)

这里是一个验证错误:

{'user': ['This field must be unique.']}

【讨论】:

  • 抱歉,这不起作用。 Django 引发异常“AttributeError: This QueryDict instance is immutable”
  • @PolRodoreda 在request.data["owner"] = 行之前尝试request.data = request.data.copy()
猜你喜欢
  • 1970-01-01
  • 2018-06-28
  • 2018-04-07
  • 1970-01-01
  • 2021-12-13
  • 2015-09-01
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多