【问题标题】:how can i create Db table using ForiegnKey relationship in DRF如何在 DRF 中使用外键关系创建 Db 表
【发布时间】:2021-07-28 05:42:34
【问题描述】:

晕,我正在使用 foreignKey 创建多个数据库表,但我遇到了一些错误,希望任何人都可以帮忙,下面是我的代码和错误消息

###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)

###serializer 文件

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.

[][1

谁能帮忙

【问题讨论】:

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


    【解决方案1】:

    错误是由这一行引起的:

    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()
    

    只要确保你的查询集只返回一个对象。

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

    【讨论】:

    • 感谢您的回复,但是当我这样做时instance=request.user.profile.school_video.filter(id=request.user.profile.id).first()) 我得到了这个错误/django/db/models/fields/related_descriptors.py", line 215, in __set__raise ValueError(ValueError: Cannot assign "&lt;CustomUser: abc@xyz.com&gt;":"SchoolVideo.school" must be a "Profile" instance.
    • 您正在过滤 school_video 并使用 Profile id 导致此错误。您需要使用SchoolVideo id 过滤school_video
    • request.user.profile.school_video.filter(id=request.user.profile.id)-- 这里request.user.profile.id不能用于school_video.filter(id=
    • 同时用school_video.first()试试看是否有效
    • 我已经试过了,现在我得到了这个错误ValueError: Cannot assign "&lt;CustomUser: abc@xyz.com&gt;": "SchoolVideo.school" must be a "Profile" instance.
    猜你喜欢
    • 1970-01-01
    • 2019-04-10
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 2014-11-18
    • 1970-01-01
    • 2020-03-03
    相关资源
    最近更新 更多