Доступ к ПК из связанной модели с использованием prefetch и to_attr - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть следующие отношения модели:

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?

EDIT

Я не упомянул, чтов моем приложении у меня будет только один CustomEmail для каждого SystemEmail для каждого клиента (см. Prefetch queryset)

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Как отметил Даниэль Роузман, email.custom_email - это список.Поэтому, чтобы получить pk, мне нужно было сделать следующее:

email.custom_email.0.pk
0 голосов
/ 11 декабря 2018

Я не уверен, почему вы ожидаете, что это сработает.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 %}
...