django 如何使用文章ID上传文章上的文档,当它甚至不存在

j91ykkif  于 2022-11-18  发布在  Go
关注(0)|答案(1)|浏览(138)

目前我在一个非常奇怪的情况。我试图上传文档使用文章ID和用户ID的文章。但问题是当我试图选择文章ID从文档模型,它给出错误,文章不存在。
这是真的,因为我怎么能上传文件到一个文章时,它甚至不存在。所以我怎么能在这种情况下使用文章ID?
下面是我的文档模型,我正在发送用户ID和文章ID上传文档。
documentmodels.py

class DocumentModel(models.Model):
    id=models.AutoField(primary_key=True, auto_created=True, verbose_name="DOCUMENT_ID")
    user_fk_doc=models.ForeignKey(User, on_delete=models.CASCADE,  related_name="users_fk_doc")
    article_fk_doc=models.ForeignKey(Article, on_delete=models.CASCADE, related_name="articles_fk_doc")
    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 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)
    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=models.CASCADE, null=True, blank=True, related_name="articles")

已编辑
实际上,我正在尝试在编辑器中的文章中实现上传文件功能。我可以根据用户上传文章的文档,但问题是在开始:
1:开头没有文章,所以我没有文章ID
2:因此,如果我没有文章ID,我就不能上传没有文章ID的文档,否则会抛出错误,即字段不能为空,或者字段为必填字段
3:我想知道我如何才能解决的问题,在开始我没有任何文章ID和上传的文件
文档views.py

class DocumentViewSet(viewsets.ModelViewSet):

    
    serializer_class=DocumentSerializer
    permission_classes=[permissions.IsAuthenticated]
    authentication_classes= [authentication.TokenAuthentication]
    parser_classes=[FormParser, MultiPartParser]

    
    def get_queryset(self):
        return DocumentModel.objects.select_related('user_fk_doc').all()

    #Cache


    @action(detail=True, methods =['get'], url_path='download')
    def download(self, request, pk):
        try:
            document_file=DocumentModel.objects.get(id=pk, user_fk_doc=self.request.user)
            file_path=document_file.document.path
            print(file_path)
            if os.path.exists(file_path):
                with open(file_path, 'rb') as fh:
                    response=HttpResponse(fh.read(), content_type=mimetypes.guess_type(file_path)[0])
                    response['Content-Disposition'] = "Inline; filename={}".format(os.path.basename(file_path))
                    response['Content-Length'] = os.path.getsize(file_path)
                    return response
            return Response({'error' : 'There is no document file of the user'}, status=status.HTTP_403_FORBIDDEN)

        except DocumentModel.DoesNotExist as e:
            return Response({'error': 'Document for this user does not exists'}, status=status.HTTP_404_NOT_FOUND)

文章views.py

class ArticleViewSet(viewsets.ModelViewSet):
    queryset=Article.objects.all()
    serializer_class=ArticleSerializer
    permission_classes=[permissions.IsAuthenticated]
    authentication_classes = [authentication.TokenAuthentication]
2w2cym1i

2w2cym1i1#

所以,我认为我试图为文章发布文档的方式是复杂的。我在文章ID还没有创建时就将文章ID添加到文档中。
因此,我想到的解决方案是在下面的文档模型中不使用这两个外键:

user_fk_doc=models.ForeignKey(User, on_delete=models.CASCADE,  related_name="users_fk_doc")
    article_fk_doc=models.ForeignKey(Article, on_delete=models.CASCADE, related_name="articles_fk_doc")

我只是简单地在文章模型中添加了一个多对多字段,所以我模型就变成了下面这样:

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)
    published=models.DateTimeField(auto_now_add=True)
    tags=models.ManyToManyField('Tags', related_name='tags', blank=True)
    **files=models.ManyToManyField('DocumentModel', related_name='uploads', 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=models.CASCADE, null=True, blank=True, related_name="articles")

然后使用多对多字段根据用户和文章筛选所有文档。
最后根据自己的情况执行这样的查询来过滤文档

DocumentModel.objects.get(id=pk,uploads__created_by_id=self.request.user.id)

相关问题