【问题标题】:expected str, bytes or os.PathLike object, not QuerySet预期的 str、bytes 或 os.PathLike 对象,而不是 QuerySet
【发布时间】:2021-08-11 05:00:41
【问题描述】:

我想从我的模型中提取文件字段并打开文件(文件为 .pdf 格式)。但我收到了这个错误:

预期的 str、字节或 os.PathLike 对象,而不是 QuerySet

我的 models.py 是:

class FileUpload(models.Model):

    author = models.ForeignKey(User, on_delete=models.CASCADE, blank=True , null=True)
    file = models.FileField(upload_to='files')

    def get_absolute_url(self):
        return reverse('home')

我的 views.py 是:

class PostDetailView(DetailView):
    context_object_name = "object_list"
    template_name = "post_detail.html"

    def get_object(self, *args,**kwargs):
        request = self.request
        pk = self.kwargs.get('pk')
        instance = FileUpload.objects.filter(id = pk)

        if instance is None:
            raise Http404("File Does not EXIST")
        else:
            pdfFileObj = open(instance, 'rb')
            pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
            print(pdfReader.numPages)
            pageObj = pdfReader.getPage(0)
            print(pageObj.extractText())
            pdfFileObj.close()
        return instance

现在我没有使用任何模板。只想在我的终端内打印文件数据。意思是当我刷新页面时出现此错误。

【问题讨论】:

  • 其实你使用的实例需要一个文件路径
  • 只做 pdfFileObj = open(instance.file.path, 'rb')

标签: python django


【解决方案1】:

您正在使用查询集而不是模型的实例。

instance = FileUpload.objects.filter(id=pk)

.filter(..) 返回一个查询集。你想要的是.get(id=pk) 来获取你的模型的单个实例。

instance = FileUpload.objects.get(id=pk)

但是您还有另一个问题是将模型实例视为文件。您需要访问实例的字段:

pdfReader = PyPDF2.PdfFileReader(instance.file)

【讨论】:

  • 我在这里拒绝了在单独的行上打开文件的编辑,因为我认为这不是必需的。传递file 字段应该就足够了,因为它可以被Pdf阅读器打开。
猜你喜欢
  • 2018-11-08
  • 2018-11-11
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 2022-01-17
  • 1970-01-01
相关资源
最近更新 更多