Python 如何在django的单个视图中显示多个ForeignKey筛选项?

Python 如何在django的单个视图中显示多个ForeignKey筛选项?,python,django,django-models,django-templates,django-views,Python,Django,Django Models,Django Templates,Django Views,我试图理解在Django模型中显示过滤数据的最佳方式 我有三个模型简化为: //models.py 类发布者(models.Model) def publisher_name=models.TextField() def publisher_slug=models.SlugField() def\u year=models.IntegerField() 班级相册(models.Model) def album_name=models.TextField() def publisher=model

我试图理解在Django模型中显示过滤数据的最佳方式

我有三个模型简化为:

//models.py
类发布者(models.Model)
def publisher_name=models.TextField()
def publisher_slug=models.SlugField()
def\u year=models.IntegerField()
班级相册(models.Model)
def album_name=models.TextField()
def publisher=models.ForeignKey('publisher',related_name='albums'))
课堂歌曲(models.Model)
def song_name=models.TextField()
def album=models.ForeignKey('album',related_name='songs'))
def published_year=models.IntegerField()
我有一个URL,它由以下内容组成:
//

我在撰写视图时遇到的问题应该是这样的细节:

标题:Publisher.Publisher\u名称 发布者发布的所有专辑列表:与发布者发布的同一年发布的该专辑中的所有歌曲列表\u发布的\u年:作为url发布的该专辑中的所有歌曲列表

我现在尝试的方法与此类似:

//views.py
类别视图(模板视图):
def获取上下文数据(自身,**kwargs):
context=super(SongYearView,self)。获取上下文数据(**kwargs)
上下文['publisher']=publisher.objects.get(slug=kwargs['publisher\u slug']
相册列表=[]
对于上下文['publisher'].albums.all()中的相册:
单曲专辑=dict()
单曲专辑['album']=专辑
单张专辑['publisher\u year\u song']=album.songs.filter(published\u year=context['publisher'].published\u year)
单曲专辑['filtered\u year\u song']=album.songs.filter(published\u year=kwargs['published\u year']
相册列表。追加(单张相册)
上下文['albums']=相册列表
返回上下文
然后在我正在做的模板中(使用精简格式)

//template.html
{{publisher.name}
{相册%中相册的%s}
{{album.album.album_name}
{album.publisher_year_song%}
{{song.song_name}
{%endfor%}
{album.filtered_year_song%}
{{song.song_name}
{%endfor%}
{%endfor%}
虽然这确实管用,但并不漂亮,我很确定有更好的方法可以做到这一点

这是一个奇怪的例子,但只是我更详细模型的一个基本示例。考虑它的方式是Publisher->Album->Song或a->B->C。我试图查看所有B项,它们仅与特定的a项链接,然后为每个B项获取两组C项,其中一组在a属性上过滤,另一组在a属性上过滤et根据URL传递的参数进行筛选

我试图得到一个自定义模型。Manager来帮助构建此模型,但运气不太好。

你可以做今年的

@register.filter
def of_year(songs, year):
    return songs.filter(published_year=year)
并将模板更改为

// template.html
{{ publisher.name }}
{% for album in publisher.albums %}
    {{  album.album.album_name }}

    {% for song in album.songs|of_year:publisher.founded_year %}
        {{ song.song_name }}
    {% endfor %}

    {% for song in album.songs|of_year:filtered_year %}
        {{ song.song_name }}
    {% endfor %}
{% endfor %}
并清理您的视图:

// views.py
class SongYearView(TemplateView):
    def get_context_data(self, **kwargs):
        context = super(SongYearView, self).get_context_data(**kwargs)
        context['publisher'] = Publisher.objects.get(slug=kwargs['publisher_slug'])
        context['filtered_year'] = kwargs['published_year']
        return context

编辑:重命名模板过滤器

我想知道这是否应该更好,啊,我不知道代码审阅部分。这个查询更多的是显示我尝试了一些东西,但我想知道对场景进行编程的正确方式。由于您的代码可以正常工作,它完全符合代码审阅指南,但您的暴露可能会少很多在…(我认为,在这里发布仍然很好)我重命名了模板过滤器:我发现这样更好。(如果我的答案解决了您的问题,请将其标记为已接受-检查箭头附近)以这种方式使用过滤器是正确的方法吗?这不是通过自定义模型管理器来更好地处理吗?正如我所读到的模板应该避免功能性。我不太擅长django,无法通过自定义模型管理器来处理它。
正如我所读到的模板应该避免功能性。
我同意这一观点我认为在您的例子中,过滤更多地与表示(模板)有关,而不是与模型有关(我尝试将过滤器限制为一个附加参数和两行代码)