目前我在一个非常奇怪的情况。我试图上传文档使用文章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]
1条答案
按热度按时间2w2cym1i1#
所以,我认为我试图为文章发布文档的方式是复杂的。我在文章ID还没有创建时就将文章ID添加到文档中。
因此,我想到的解决方案是在下面的文档模型中不使用这两个外键:
我只是简单地在文章模型中添加了一个多对多字段,所以我模型就变成了下面这样:
然后使用多对多字段根据用户和文章筛选所有文档。
最后根据自己的情况执行这样的查询来过滤文档