Django检查相关对象的所有实例是否都包含特定值

时间:2019-12-08 18:53:00

标签: django django-templates

这是我的models.py

APPLICATION_STATUS = (
        ('Pending', 'Pending'),
        ('Shorlisted', 'Shortlisted'),
        ('Not Shortlisted', 'Not Shortlisted'),
    )

class Vacancy(models.Model):
    name = models.CharField(max_length=200)

class Applicant(models.Model):
    year = models.IntegerField(default=datetime.date.today().year)
    vacancy = models.ForeignKey(Vacancy, on_delete=models.SET_NULL, related_name='applicants')
    status = models.CharField(max_length=200, choices=APPLICATION_STATUS)

因此,我正在尝试检查特定空缺的所有申请人的status是否正在模板中,但我无法解决。

到目前为止,这是我的模板:

{% for vacancy in vacancies  %}                     
    <tr>
        <td>{{forloop.counter}}</td>
        <td>{{vacancy.vacancy_number}}</td>
        <td>{{vacancy.name}}</td>
        <td class="text-center">{{vacancy.applicants.count}}</td>                           
        <td>
            {% if vacancy.applicants.count > 0 %}
                {% if vacancy.closing_date < today %}
                    [<a href="{% url 'shortlisting' vacancy.id %}">Shortlist</a>]
                    {% else %}
                    Vacancies are still active  
                {% endif %}
                {% else %}
                No applications for vacancy
            {% endif %}

        </td>
    </tr>             
{% endfor %}

如何检查:

vacancy.applicants.status != "Pending"

只是大致了解要实施的内容。

我知道我可以使用vacancy.applicants来获得特定空缺的所有相关申请人,但是我无法解决这些申请人的状态是否待定。

2 个答案:

答案 0 :(得分:1)

如果您要遍历Applicants到特定的Vacancy并逐一检查,请使用:

{% for applicant in vacancy.applicants.all %}
    {% if applicant.status != "Pending" %}
        <!-- do something here -->
    {% endif %}
{% endfor %}

,或者如果您只想检查特定status的所有申请人的vacancy是否未待审核,并且模板中需要是/否答案,请在您的Vacancy模型中添加属性,如下所示:

class Vacancy(models.Model):
    name = models.CharField(max_length=200)

    @property
    def check_all_applicant_status(self):
        return self.applicants.exclude(status='Pending').exists()

并在您的模板中:

<p>{% vacancy.check_all_applicant_status %}</p>

答案 1 :(得分:1)

Django不允许在模板中进行过滤,因此您必须在视图中进行过滤或使用模板标签。

您可以在视图中使用注释:

from django.db.models import Count, Q

vacancies = Vacancy.objects.all().annotate(pending_count=Count("applicants", filter=Q(applicants__status="Pending")))

现在,如果pending_count为0,则表明空缺实例中没有处于待处理状态的申请人。

{% if vacancy.pending_count == 0 %}
    <p>None of the applicants are pending ...</p>
{% endif %}