类型错误:禁止直接指定到相关集合的反面。改为使用缩略图.set()

2024-09-30 06:26:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图让我的序列化程序工作,但我遇到了这个错误:TypeError: Direct assignment to the reverse side of a related set is prohibited. Use thumbnails.set() instead.,我不知道如何修复它。我尝试用谷歌搜索这个问题,但只发现了这个docs,我不知道如何在代码中实现它:

class YoutubeSnippetSerializer(serializers.ModelSerializer):
    thumbnails = YoutubeThumbnailSerializer(many=True)

    class Meta:
        model = YoutubeSnippet
        fields = ['publishedAt', 'channelId', 'title', 'thumbnails', 'channelTitle', 'liveBroadcastContent', 'publishTime']

    def create(self, validated_data):
        thumb_data = validated_data.pop("thumbnails")
        snippet = YoutubeSnippet.objects.create(**validated_data)
        YoutubeThumbnails.objects.create(snippet=snippet, size="default", **thumb_data.pop("default"))
        YoutubeThumbnails.objects.create(snippet=snippet, size="medium", **thumb_data.pop("medium"))
        YoutubeThumbnails.objects.create(snippet=snippet, size="high", **thumb_data.pop("high"))
        return snippet

添加缩略图变量时会出现问题。(thumbnails = YoutubeThumbnailSerializer(many=True)&;'thumbnails'

代码:

class YoutubeVideoSerializer(serializers.ModelSerializer):
    youtubeId = YoutubeIdSerializer(many=True)
    snippet = YoutubeSnippetSerializer(many=True)

    class Meta:
        model = YoutubeVideo
        fields = ['kind', 'etag', 'youtubeId', 'snippet']

    def create(self, validated_data):
        id_data = validated_data.pop("youtubeId")
        snippet_data = validated_data.pop("snippet")
        video = YoutubeVideo.objects.create(**validated_data)
        for data in id_data:
            YoutubeId.objects.create(youtubeVideo=video, **data)
        for data in snippet_data:
            YoutubeSnippet.objects.create(youtubeVideo=video, **data)
        return video

class YoutubeThumbnailSerializer(serializers.ModelSerializer):
    class Meta:
        model = YoutubeThumbnails
        fields = ['url', 'width', 'height']

型号:

class YoutubeVideo(models.Model):
    kind = models.CharField(max_length=255, null=True)
    etag = models.CharField(max_length=255, null=True)


class YoutubeSnippet(models.Model):
    publishedAt = models.DateTimeField(null=True)
    channelId = models.CharField(max_length=255, null=True)
    title = models.CharField(max_length=1084, null=True)
    channelTitle = models.CharField(max_length=255, null=True)
    liveBroadcastContent = models.CharField(max_length=255, null=True)
    publishTime = models.DateTimeField(null=True)
    youtubeVideo = models.ForeignKey(YoutubeVideo, related_name='snippet', on_delete=models.CASCADE)


class YoutubeThumbnails(models.Model):
    size = models.CharField(max_length=255, null=True)
    url = models.URLField(null=True)
    width = models.IntegerField(null=True)
    height = models.IntegerField(null=True)
    snippet = models.ForeignKey(YoutubeSnippet, related_name='thumbnails', on_delete=models.CASCADE)

我真的希望有人能给我指出正确的方向我完全迷路了

回溯:

Traceback (most recent call last):
  File "Y:\interperters\Personal_website_server\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "Y:\interperters\Personal_website_server\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "Y:\interperters\Personal_website_server\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "Y:\interperters\Personal_website_server\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "Y:\interperters\Personal_website_server\lib\site-packages\django\views\generic\base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "Y:\interperters\Personal_website_server\lib\site-packages\rest_framework\views.py", line 505, in dispatch
    response = self.handle_exception(exc)
  File "Y:\interperters\Personal_website_server\lib\site-packages\rest_framework\views.py", line 465, in handle_exception
    self.raise_uncaught_exception(exc)
  File "Y:\interperters\Personal_website_server\lib\site-packages\rest_framework\views.py", line 476, in raise_uncaught_exception
    raise exc
  File "Y:\interperters\Personal_website_server\lib\site-packages\rest_framework\views.py", line 502, in dispatch
    response = handler(request, *args, **kwargs)
  File "Y:\interperters\Personal_website_server\lib\site-packages\rest_framework\decorators.py", line 50, in handler
    return func(*args, **kwargs)
  File "Y:\GitRepo\Personal_website_server\esfand_app\api\views.py", line 27, in create_video
    serializer.save()
  File "Y:\interperters\Personal_website_server\lib\site-packages\rest_framework\serializers.py", line 212, in save
    self.instance = self.create(validated_data)
  File "Y:\GitRepo\Personal_website_server\esfand_app\api\serializers.py", line 69, in create
    YoutubeSnippet.objects.create(youtubeVideo=video, **data)
  File "Y:\interperters\Personal_website_server\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "Y:\interperters\Personal_website_server\lib\site-packages\django\db\models\query.py", line 431, in create
    obj = self.model(**kwargs)
  File "Y:\interperters\Personal_website_server\lib\site-packages\django\db\models\base.py", line 495, in __init__
    _setattr(self, prop, kwargs[prop])
  File "Y:\interperters\Personal_website_server\lib\site-packages\django\db\models\fields\related_descriptors.py", line 546, in __set__
    % self._get_set_deprecation_msg_params(),
TypeError: Direct assignment to the reverse side of a related set is prohibited. Use thumbnails.set() instead.

Tags: inpytruedataservermodelslibpackages

热门问题