使用预取和to_attr

时间:2018-12-11 10:06:13

标签: django django-queryset django-orm

我有以下模型关系:

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))

现在,在我的模板中,我试图像这样从相关pkCustomEmail访问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查询集)

2 个答案:

答案 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