在Django中为Zipview返回多个到多个关系的文件字段

时间:2015-08-02 14:43:50

标签: python django

我尝试动态压缩使用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列表?

2 个答案:

答案 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