Как загрузить файл с помощью поля "многие ко многим" в 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
вместо этого.