如何在 DRF 中使用 ForiegnKey 关系创建 Db 表

时间:2021-07-28 05:42:34

标签: django django-models django-rest-framework django-views django-serializer

晕,我正在使用外键创建多个数据库表,但我遇到了一些错误,希望有人能帮忙,下面是我的代码和错误消息

###models.py 文件

 class SchoolVideo(models.Model):
    school = models.ForeignKey(
        Profile, on_delete=models.CASCADE, related_name='school_video')
    intro_video = models.FileField(
        upload_to='assets/videos', blank=True, null=True)

###序列化文件

class VideoSerializer(serializers.ModelSerializer):

    class Meta:
        model = SchoolVideo
        fields = ('intro_video',)

        def create(self, validated_data, *args, **kwargs):
            if 'user' in validated_data:
                user = validated_data.pop('user')
            else:
                user = Profile.objects.create(**validated_data)
            school_video = SchoolVideo.objects.update_or_create(
                user=user, defaults=validated_data
            )
            return school_video

###API 视图

class SchoolVideoAPi(generics.CreateAPIView):
    serializer_class = VideoSerializer
    queryset = SchoolVideo.objects.all()
    permission_class = [permissions.IsAuthenticated]
    parser_classes = (MultiPartParser, FormParser)

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(
            data=request.data, instance=request.user.profile.school_video
        )
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(
            serializer.data,
            message='Video successfully Uploaded',
            status=status.HTTPS_201_CREATED,
            headers=headers,
        )

    def perform_create(self, serializer):
        print(self.request.user.profile)

        serializer.save(user=self.request.user.profile)

这是我收到的回溯/错误消息 ##err 回溯

    response = handler(request, *args, **kwargs)
  File "/home/olaneat/Desktop/files/project/django/schMrk/lib/python3.8/site-packages/rest_framework/generics.py", line 190, in post
    return self.create(request, *args, **kwargs)
  File "/home/olaneat/Desktop/files/project/django/schMrk/sch-market/schoolDetail/apiviews.py", line 117, in create
    self.perform_create(serializer)
  File "/home/olaneat/Desktop/files/project/django/schMrk/sch-market/schoolDetail/apiviews.py", line 128, in perform_create
    serializer.save(user=self.request.user.profile)
  File "/home/olaneat/Desktop/files/project/django/schMrk/lib/python3.8/site-packages/rest_framework/serializers.py", line 205, in save
    self.instance = self.create(validated_data)
  File "/home/olaneat/Desktop/files/project/django/schMrk/lib/python3.8/site-packages/rest_framework/serializers.py", line 939, in create
    instance = ModelClass._default_manager.create(**validated_data)
  File "/home/olaneat/Desktop/files/project/django/schMrk/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/olaneat/Desktop/files/project/django/schMrk/lib/python3.8/site-packages/django/db/models/query.py", line 445, in create
    obj = self.model(**kwargs)
  File "/home/olaneat/Desktop/files/project/django/schMrk/lib/python3.8/site-packages/django/db/models/base.py", line 483, in __init__
    _setattr(self, field.name, rel_obj)
  File "/home/olaneat/Desktop/files/project/django/schMrk/lib/python3.8/site-packages/django/db/models/fields/related_descriptors.py", line 215, in __set__
    raise ValueError(
ValueError: Cannot assign "<CustomUser: abc@xyz.com>": "SchoolVideo.school" must be a "Profile" instance.

[enter image description here][1]

谁能帮帮忙

1 个答案:

答案 0 :(得分:0)

错误是由这一行引起的:

instance=request.user.profile.school_video

正如错误所说,您将 school_video 作为实例传递,但它失败了,因为它是 RelatedManager。只需过滤出您需要解决此问题的 school_video

例如:

instance=request.user.profile.school_video.first()

instance=request.user.profile.school_video.filter(<your filters).first()

只需确保您的查询集仅返回一个对象。

同样,下次请尽量避免为代码和错误添加图像,而将它们作为文本放在问题中。

相关问题