【问题标题】:How to upload file using many to many field in django rest framework如何在 django rest 框架中使用多对多字段上传文件
【发布时间】:2022-11-20 05:44:02
【问题描述】:

我有两个模型。一个是文章,另一个是文档模型。文档模型包含用于上传文档的文件字段以及上传文档的一些其他元数据。文章有一个与文档模型相关的 m2m 字段。文章模型有一个字段用户,根据发布的是哪篇文章。

我想使用 m2m 字段上传文件,但它给出了两个错误:

“文件”:[ “类型不正确。预期的 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' ]
        

【问题讨论】:

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


    【解决方案1】:

    您不能将文件添加到 M2M 字段,因为 M2M 字段包含其他模型的对象。

    如果你有DocumentModel的M2M,它只会接受DocumentModel的对象。它只需要 DocumentModel 对象的主键。

    要上传文件,您可以改用FileField

    【讨论】:

      猜你喜欢
      • 2017-01-31
      • 1970-01-01
      • 2017-01-17
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      • 2019-09-18
      • 2018-10-14
      • 1970-01-01
      相关资源
      最近更新 更多