我有以下模型关系:
class CustomEmail(models.Model):
template = models.ForeignKey(SystemEmail, on_delete=models.CASCADE)
在ListView
中,我正在显示SystemEmail
对象,这些对象是通过以下方式获得的:
def get_queryset(self):
prefetch = Prefetch('customemail_set',
queryset=CustomEmail.objects.filter(client=self.request.user.client),
to_attr='custom_email')
return (SystemEmail.objects.filter(user_editable=True)
.order_by('template_name').prefetch_related(prefetch))
现在,在我的模板中,我试图像这样从相关pk
到CustomEmail
访问to_att
:
{% for email in system_emails %}
{% if email.custom_email %}
<li><a href="{% url 'settings:edit_custom_email' email.custom_email.pk %}">Edit</a></li>
{% endif %}
{% endfor %}
我称为email.custom_email.pk
的那部分不会重播任何内容。我(如果有可能)如何使用pk
从相关to_attr
中获得CustomEmail
?
编辑
我省略了提及,在我的应用程序中,每个客户端的每个CustomEmail
仅会有一个SystemEmail
(请参见Prefetch
查询集)
答案 0 :(得分:2)
我不确定您为什么希望它能起作用。 prefetch_related
用于关系的许多方面-您为每个电子邮件都有一个项目查询集。仅仅因为您将其附加到custom_email
而不是customemail_set
上并不意味着突然有单个项目;还有很多,email.custom_email
是CustomEmail对象的列表。
所以您可能需要遍历列表:
{% for custom_email in email.custom_email.all %}
<li><a href="{% url 'settings:edit_custom_email' custom_email.pk %}">Edit</a></li>
{% endfor %}
答案 1 :(得分:0)
正如丹尼尔·罗斯曼(Daniel Roseman)所指出的,email.custom_email
是一个列表。因此,为了获得pk
,我需要执行以下操作:
email.custom_email.0.pk