使用预取和 to_attr 从相关模型访问 pk
Access pk from related model using prefetch and to_attr
我有以下模型关系:
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))
现在,在我的模板中,我正尝试通过 to_att
从相关 CustomEmail
访问 pk
,如下所示:
{% 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
的部分不会重新运行任何内容。我如何(如果可能的话)使用相关 CustomEmail
中的 to_attr
获得 pk
?
编辑
我没有提到,在我的申请中,每个客户的每个 SystemEmail
我只会有一个 CustomEmail
(参见 Prefetch
查询集)
我不确定您为什么希望它起作用。 prefetch_related
用于关系的多方面 - 每封电子邮件都有一个项目查询集。仅仅因为您将它附加到 custom_email
而不是 customemail_set
并不意味着突然有一个项目;还有很多,email.custom_email
是一个 list 的 CustomEmail 对象。
因此您可能需要遍历列表:
{% for custom_email in email.custom_email.all %}
<li><a href="{% url 'settings:edit_custom_email' custom_email.pk %}">Edit</a></li>
{% endfor %}
正如 Daniel Roseman 所指出的,email.custom_email
是一个列表。因此,为了获得 pk
,我需要执行以下操作:
email.custom_email.0.pk
我有以下模型关系:
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))
现在,在我的模板中,我正尝试通过 to_att
从相关 CustomEmail
访问 pk
,如下所示:
{% 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
的部分不会重新运行任何内容。我如何(如果可能的话)使用相关 CustomEmail
中的 to_attr
获得 pk
?
编辑
我没有提到,在我的申请中,每个客户的每个 SystemEmail
我只会有一个 CustomEmail
(参见 Prefetch
查询集)
我不确定您为什么希望它起作用。 prefetch_related
用于关系的多方面 - 每封电子邮件都有一个项目查询集。仅仅因为您将它附加到 custom_email
而不是 customemail_set
并不意味着突然有一个项目;还有很多,email.custom_email
是一个 list 的 CustomEmail 对象。
因此您可能需要遍历列表:
{% for custom_email in email.custom_email.all %}
<li><a href="{% url 'settings:edit_custom_email' custom_email.pk %}">Edit</a></li>
{% endfor %}
正如 Daniel Roseman 所指出的,email.custom_email
是一个列表。因此,为了获得 pk
,我需要执行以下操作:
email.custom_email.0.pk