我有模特
class Audiopart(models.Model):
book_id = models.ForeignKey(Audiobook, on_delete=models.CASCADE)
part_title = models.CharField(max_length = 255)
part_text = models.TextField(blank = True, null=True)
part_reader = models.CharField(max_length = 255)
filename = models.FileField(upload_to=get_upload_path, blank=True)
具有功能
def get_upload_path(instance, filename):
return os.path.join(
'audio',
instance.book_id.folder,
filename
)
我想在目录中上传文件,然后仅将文件名(无路径)保存在数据库中。但找不到任何方法。
所以,我做了一个清理文件名的功能
def clear_filename(_filename):
if '/' in _filename:
_filename = _filename.split('/')[2]
return _filename
如何在具有清除文件名的视图中打印对象?
def audioparts(request, _book_id):
all_audioparts = list(Audiopart.objects.filter(book_id=_book_id, published=True).values())
return JsonResponse(all_audioparts, safe=False)
FileField
是什么。它实际上是用于存储和访问文件本身。因此,您的字段不应称为filename
,而应称为file
或audio_file
或描述file的名称。
AudioPart
的实例时,例如part
,实际上您可以直接访问文件:part.filename
是代码中的file
,而不是名称。如果您只想使用一种方法来访问文件名,请在模型上定义一个@property
:import os
class AudioPart(Model):
file = FileField(...)
...
@property
def filename(self):
return os.path.basename(self.file.name)
然后part.file
是文件,part.filename
是文件名。这样,您可以read()
文件或返回其URL,以便人们可以下载文件(part.file.url
)或以其他方式对其进行操作。在您看来,您可以循环返回文件以将文件名添加到列表中,然后返回JSON。