使用预取和 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