Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django获取不同的';儿童';ForeignKey相关模型(是否在模板中执行此操作?)_Django_Django Templates_Foreign Keys_Django Generic Views - Fatal编程技术网

django获取不同的';儿童';ForeignKey相关模型(是否在模板中执行此操作?)

django获取不同的';儿童';ForeignKey相关模型(是否在模板中执行此操作?),django,django-templates,foreign-keys,django-generic-views,Django,Django Templates,Foreign Keys,Django Generic Views,我正在制作一个已发行音乐专辑的数据库 models.py class Image(models.Model): image = models.ImageField(.... class Album(models.Model): title = models.CharField(.... class Release(models.Model): album = models.ForeignKey(Album) cover_art = models.Foreign

我正在制作一个已发行音乐专辑的数据库

models.py

class Image(models.Model):
    image = models.ImageField(....

class Album(models.Model):
    title = models.CharField(....

class Release(models.Model):
    album = models.ForeignKey(Album)
    cover_art = models.ForeignKey(Image, blank=True, null=True, on_delete=models.SET_NULL)
在我的模板中(目前我正在使用通用视图),我有:

问题是,有时一张专辑已经发行了好几次,封面都是相同的,在这种情况下,我只想显示一次图像,并用一些文本列出与之相关的发行版本

我试过:

{% for i in a.release_set.cover_art %}
{% for i in a.release_set.cover_art_set %}
{% for i in a.release_set.all.cover_art %}
{% for i in a.release_set.all.cover_art_set %}
或者在一个更简单的情况下,如果有多个图像,我至少希望显示更小的图像

{% if a.release_set.count > 1 %} # works but displays duplicate images
{% if a.release_set.cover_art_set.count > 1 %} # doesn't work (see above)

是否可以通过反转此ForeignKey查找,然后询问其子对象集来获取相关对象的列表?我能想到的唯一方法是在视图中组合一些元组/列表。

如果我理解正确:

  • 一张专辑可以有几个版本
  • 一个版本只有一个封面
  • 你想循环一张专辑的所有封面
在这种情况下,应采取以下措施:

{% for release in a.release_set.all %}
  {{ release.cover_art.image }}
{% endfor %}
如果要防止列出相同的封套,可以比较循环中的封套,或者在视图中准备具有不同封套的集合,以便将其传递给模板

# Solution using a set
context['distinct_coverimages'] = \
    set([r.cover_art.image for r in album.release_set.all()])

# Solution using two queries, might perform better
pks = album.release_set.values_list('cover_art__pk', flat=True)
context['distinct_coverimages'] = models.Image.filter(pk__in=pks).distinct()
第三种选择是为相册创建自定义模板过滤器,以返回所有不同的发行版封面


无论如何,我建议在Django shell中调试这些东西。您可以使用
/manage.py shell
发出shell。如果已安装,还可以使用
/manage.py shell\u plus
自动加载所有型号。所有不需要参数的对象属性和函数(例如,普通实例属性或不带参数的实例函数,如
'string'.isalnum()
)也可以在模板中以相同的方式使用(仅不带括号)。

如果我理解正确:

# Solution using a set
context['distinct_coverimages'] = \
    set([r.cover_art.image for r in album.release_set.all()])

# Solution using two queries, might perform better
pks = album.release_set.values_list('cover_art__pk', flat=True)
context['distinct_coverimages'] = models.Image.filter(pk__in=pks).distinct()
  • 一张专辑可以有几个版本
  • 一个版本只有一个封面
  • 你想循环一张专辑的所有封面
在这种情况下,应采取以下措施:

{% for release in a.release_set.all %}
  {{ release.cover_art.image }}
{% endfor %}
如果要防止列出相同的封套,可以比较循环中的封套,或者在视图中准备具有不同封套的集合,以便将其传递给模板

# Solution using a set
context['distinct_coverimages'] = \
    set([r.cover_art.image for r in album.release_set.all()])

# Solution using two queries, might perform better
pks = album.release_set.values_list('cover_art__pk', flat=True)
context['distinct_coverimages'] = models.Image.filter(pk__in=pks).distinct()
第三种选择是为相册创建自定义模板过滤器,以返回所有不同的发行版封面


无论如何,我建议在Django shell中调试这些东西。您可以使用
/manage.py shell
发出shell。如果已安装,还可以使用
/manage.py shell\u plus
自动加载所有型号。所有不需要参数的对象属性和函数(例如,普通实例属性或不带参数的实例函数,如
'string'.isalnum()
)也可以在模板中以相同的方式使用(只需不带括号)。

我在相册模型上使用了一个新方法:

# Solution using a set
context['distinct_coverimages'] = \
    set([r.cover_art.image for r in album.release_set.all()])

# Solution using two queries, might perform better
pks = album.release_set.values_list('cover_art__pk', flat=True)
context['distinct_coverimages'] = models.Image.filter(pk__in=pks).distinct()
class Album(models.Model):
    title = models.CharField(....

    def distinct_cover_images(self):
        "Returns the queryset of distinct images used for this album cover"
        pks = self.release_set.all().values_list('cover_art__pk', flat=True)
        distinct_cover_images = Images.objects.filter(pk__in=pks).distinct()
        return distinct_cover_images
那么模板就简单多了:

{% for i in a.distinct_cover_images %}

但是要归功于@danilobargen对这段代码的贡献。

我在专辑模型上使用了一种新方法:

class Album(models.Model):
    title = models.CharField(....

    def distinct_cover_images(self):
        "Returns the queryset of distinct images used for this album cover"
        pks = self.release_set.all().values_list('cover_art__pk', flat=True)
        distinct_cover_images = Images.objects.filter(pk__in=pks).distinct()
        return distinct_cover_images
那么模板就简单多了:

{% for i in a.distinct_cover_images %}

但是要归功于@danilobargen对这段代码的贡献。

是的,对不起,我应该更清楚:我已经有了一个正在工作的forloop。这是我要删除的重复项。@nimasmi查看我的编辑和示例,以获得可能的解决方案。@nimasmi我刚刚用另一个解决方案编辑了我的答案,该解决方案防止使用列表理解和集合。谢谢。我不知道你的
上下文[''.']
代码是做什么的。我在视图中,在一个forloop中尝试了它(我必须对
Collection.objects.all()
执行此操作),并得到了NameError。我从django.template导入上下文中尝试了
,然后尝试了
Context['…']
,结果得到了TypeError:“type”对象不支持项分配。我保证我已经搜索过了,但是这条线在做什么?为了记录在案,第一个比较循环中的封面的建议不会失败,因为它们不一定是相邻的吗?e、 g.使用
{%ifchanged r.cover\u art%}
。如果我运气好的话可能会有用。是的,对不起,我应该说得更清楚些:我已经有了一个正在工作的forloop。这是我要删除的重复项。@nimasmi查看我的编辑和示例,以获得可能的解决方案。@nimasmi我刚刚用另一个解决方案编辑了我的答案,该解决方案防止使用列表理解和集合。谢谢。我不知道你的
上下文[''.']
代码是做什么的。我在视图中,在一个forloop中尝试了它(我必须对
Collection.objects.all()
执行此操作),并得到了NameError。我从django.template导入上下文中尝试了
,然后尝试了
Context['…']
,结果得到了TypeError:“type”对象不支持项分配。我保证我已经搜索过了,但是这条线在做什么?为了记录在案,第一个比较循环中的封面的建议不会失败,因为它们不一定是相邻的吗?e、 g.使用
{%ifchanged r.cover\u art%}
。如果我运气好的话可能会有用。啊,当然,我不知怎么忘记了:)好的解决办法。很好的答案。。。好主意,但我的实现有问题。我的
ForeginKey
关系与另一个应用程序中的不同型号有关。我原以为只要简单地导入该模型,这仍然有效,但它似乎在涉及该关系的两个应用程序上触发了一个
ImportError
。有什么想法吗?听起来可能是循环导入,特别是如果外键是在其他应用程序中定义的,因为该应用程序已经从该模块导入了模型。在这里,您可以尝试将导入语句
从其他应用程序导入模型
移动到函数定义内部,即在
def distinct\u cover\u images(self)
啊,当然,我忘记了:)很好的解决方案。回答很好。。。好主意,但我的实现有问题。我的鳕鱼