Как загрузить файл с помощью поля "многие ко многим" в django rest framework

У меня есть две модели. Одна из них - статья, а другая - модель документов. Модель документов содержит поле file для загрузки документа, а также некоторые другие метаданные загруженного документа. Статья имеет поле m2m, которое относится к модели документа. Модель статьи имеет поле user, в соответствии с которым размещается статья.

Я хочу загрузить файл с помощью поля m2m, но он выдает две ошибки:

"files": [ "Неправильный тип. Ожидалось значение pk, получено InMemoryUploadedFile."]

Я также пробовал использовать поле slug, документ не существует. но я загружаю новый файл, тогда почему говорится, что документ не существует.

Пожалуйста, подскажите, как я могу этого добиться?

Модель статьи

class Article(models.Model):
    id=models.AutoField(primary_key=True, auto_created=True, verbose_name="ARTICLE_ID")
    headline=models.CharField(max_length=250)
    abstract=models.TextField(max_length=1500, blank=True)
    content=models.TextField(max_length=10000, blank=True)
    files=models.ManyToManyField('DocumentModel', related_name='file_documents',related_query_name='select_files', blank=True)
    published=models.DateTimeField(auto_now_add=True)
    tags=models.ManyToManyField('Tags', related_name='tags', blank=True)
    isDraft=models.BooleanField(blank=True, default=False)
    isFavourite=models.ManyToManyField(User, related_name="favourite", blank=True)
    created_by=models.ForeignKey(User, on_delete=mode

Модель документа

class DocumentModel(models.Model):
    id=models.AutoField(primary_key=True, auto_created=True, verbose_name="DOCUMENT_ID")
    document=models.FileField(max_length=350,  validators=[FileExtensionValidator(extensions)], upload_to=uploaded_files)
    filename=models.CharField(max_length=100, blank=True)
    filesize=models.IntegerField(default=0, blank=True)
    mimetype=models.CharField(max_length=100, blank=True)
    created_at=models.DateField(auto_now_add=True)
    

Сериализатор статей

class ArticleSerializer(serializers.ModelSerializer):


   #serializer for getting username of User
    created_by=serializers.CharField(source='created_by.username', read_only=True)
    isFavourite=serializers.PrimaryKeyRelatedField(many=True, read_only=True)
    tags=serializers.SlugRelatedField(many=True, queryset=Tags.objects.all(), slug_field="tag")
    readtime=serializers.IntegerField(read_only=True)
    

    class Meta:
        model= Article
        fields = ["id" , "headline", "abstract", "content", "readtime", "get_published_timestamp",  "isDraft", "isFavourite", "tags", 'files',  'created_by'  ]  
        

Сериализатор документов

class DocumentSerializer(serializers.ModelSerializer):
    
    filesize=serializers.ReadOnlyField(source='sizeoffile')
          
    class Meta:
        model=DocumentModel
        fields = ['id', 'document', 'filesize', 'filename', 'mimetype', 'created_at' ]
        

Вы не можете добавлять файлы в поля M2M, потому что поля M2M содержат объекты других моделей.

Если у вас есть M2M из DocumentModel, он будет принимать только объекты из DocumentModel. Он ожидает только первичные ключи объектов DocumentModel.

Для загрузки файлов вы можете использовать FileField вместо этого.

Вернуться на верх