我尝试动态压缩使用django-zipview链接的音频文件。但是我似乎无法为它提供正确的输入。
声音有文件,声音可以是发行版或许多版本的一部分。我想(至少现在)当用户点击网址时,动态提供包含发布中所有声音的zip文件:url(r'^release/(?P<slug>[a-zA-Z0-9_-]+)/download$', views.ReleaseArchiveView.as_view(), name='release_download'),
(网址正常)
Models.py (已移除无关字段)
class Release(models.Model):
sound = models.ManyToManyField(Sound)
release_title = models.CharField(max_length=64)
slug = AutoSlugField(populate_from='release_title',unique=True)
class Sound(models.Model):
sound_title = models.CharField(max_length=64)
file = models.FileField(upload_to=upload_path,blank=True)
slug = AutoSlugField(populate_from=('sound_title'),unique=True)
Views.py
class ReleaseArchiveView(BaseZipView):
model = Release
def get_files(self):
release = Release.objects.get(slug=self.kwargs['slug'])
return Sound.objects.filter(release__slug=release)
根据文档,django-zipview只需要一个来自Sounds的文件字段列表。但是我无法找到正确的查询以允许我传递此信息。目前我只是返回一个空的zip文件。
如何以django-zipview期待的方式传递FileField列表?
答案 0 :(得分:0)
您只需要再次查看您链接到的GitHub上的django-zipview页面,它们会提供您需要的示例:
class ReleaseArchiveView(BaseZipView):
model = Release
def get_files(self):
sounds = Sound.objects.filter(release__slug=self.kwargs.get('slug'))
return [s.file.file for s in sounds if s.file.name]
你错过了最后一部分,他们返回了一个文件对象列表。
此外,您的代码在我看来并没有意义:
release = Release.objects.get(slug=self.kwargs['slug'])
return Sound.objects.filter(release__slug=release)
...您传递了Release
个实例作为slug
值,当我猜你真的是release.slug
时。但无论如何,您似乎在release
模型上将Sound
作为外键,因此您无需先获得此版本。
答案 1 :(得分:-1)
return Sound.objects.filter(release__slug=release)
返回整个查询集。如果只想返回文件名,则只需返回值:
return list(Sound.objects.filter(release__slug= self.kwargs['slug']).values_list('file', flat=True))
将返回文件名列表
请参阅Floyd–Warshall docs