Как исправить ошибку «слишком много значений для распаковки» при загрузке файла в сериализатор модели - PullRequest
2 голосов
/ 09 апреля 2019

Я столкнулся с проблемой ниже при загрузке файла ModelSerializer.

Выпуск 1) Я пытаюсь загрузить файлы, используя ModelSerializer. У меня есть две модели BlogFilesSerializer и BlogSerializer. при попытке загрузить файл показывает too many values to unpack error, и я знаю его значение, почему это происходит, но не знаю, как обрабатывать эти исключения.

serializers.py

class BlogFilesSerializer(ModelSerializer):
    created_at = serializers.SerializerMethodField()
    updated_at = serializers.SerializerMethodField()
    class Meta:
        model = BlogFilesModel
        fields = ('blog_files_id', 'blog', 'path',
                  'created_at', 'updated_at')


class BlogSerializer(ModelSerializer):
    blog_files = serializers.SerializerMethodField()
    uploaded_files = serializers.FileField(required=True, source='*')
    blog_created_at = serializers.SerializerMethodField()

    def get_blog_files(self, obj):
        info = BlogFilesSerializer(BlogFilesModel.objects.filter(
            blog=obj).order_by('-pk'), many=True)

        if info.data:
            for i in info.data:
                user_detail = User.objects.get(pk=obj.user.id)
                i.__setitem__('user_detail', UserSerializer(user_detail).data)
                if i.get('user_detail'):
                    try:
                        del i['user_detail']['password']
                    except expression as identifier:
                        pass

        return info.data

    def get_blog_created_at(self, obj):
        formatted_date = obj.created_at.strftime("%d-%m-%Y")
        return formatted_date

    class Meta:
        model = BlogModel
        fields = ('blog_id', 'user', 'title', 'content',
                  'status',
                  'blog_files', 'blog_created_at',
                  'uploaded_files'
                  )

    def create(self, validated_data):
        instance = BlogModel.objects.create(**validated_data)
        return instance

views.py

class BlogViewSet(viewsets.ModelViewSet):
    queryset = BlogModel.objects.all()
    lookup_field = 'blog_id'
    serializer_class = BlogSerializer
    parser_classes = (MultiPartParser, FormParser,FileUploadParser)


models.py

class BlogModel(models.Model):

    BLOG_STATUS = (
        ('PUBLISH', 'Publish'),
        ('DRAFT', 'Draft'),
    )

    blog_id = models.AutoField(primary_key=True)
    user = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name='blogs')
    title = models.CharField(max_length=255)
    content = models.TextField(blank=True, null=True)
    status = models.CharField(max_length=7, choices=BLOG_STATUS)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta():
        db_table = 'blogs'
        verbose_name = 'Blog'
        verbose_name_plural = 'Blogs'

    def __str__(self):
        return self.title

    @property
    def files(self):
        return 'something'


def blog_directory_path(instance, filename):
    return 'uploads/blogs/{}'.format(filename+str(datetime.now()))

class BlogFilesModel(models.Model):
    blog_files_id = models.AutoField(primary_key=True)
    blog = models.ForeignKey(
        BlogModel, on_delete=models.CASCADE, related_name='blogs',blank=True)
    path = models.FileField(blank=False, null=False,upload_to=blog_directory_path)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta():
        db_table = 'blog_files'
        verbose_name = 'Blog'
        verbose_name_plural = 'Blogs'

    def __str__(self):
        return str(self.path)

Issue 2) Я также не могу выбрать несколько файлов для загрузки в BlogSerializer и в поле uploaded_files = serializers.FileField(required=True, source='*'), и их подробное объяснение не приводится в документации DRF. Как я могу добавить атрибут multple в поле файла.

Here  is the image of element Server Traceback error

РЕДАКТИРОВАТЬ 1: Я пытался и получил до здесь в def to_internal_value(self, data): field.source_attrs = [] их не ключ, поэтому я получаю эту ошибку. в моем ModelSerializer я попробовал это uploaded_files = serializers.FileField(required=True, source='files') добавил files как свойство к BlogModel, теперь я получаю 'Error = files' is an invalid keyword argument for this function, может кто-нибудь направить меня сюда.

Надеюсь, я хорошо объяснил мою проблему.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...