При отображении набора запросов базы внешнего ключа в шаблоне - PullRequest
2 голосов
/ 17 июня 2020

У меня есть две модели, показанные ниже

class Services(models.Model):

    name = models.CharField(max_length=200, null=True)
    price = models.FloatField(null=True)
    service_sku = models.CharField(max_length=200, null=True)


class Order(models.Model):

    customer = models.ForeignKey(Customer, null=True, on_delete = models.SET_NULL)
    service = models.ForeignKey(Service, null=True, on_delete = models.SET_NULL)

Я создал представление на основе функций на основе модели службы, где я хочу отобразить шаблон, отображающий список информации о полях из каждого экземпляра из службы модель.

Мои представления и шаблон см. ниже

views.py 

def service_list(request):

    service_list = Service.objects.all().order_by('service_sku')


    context = {'service_list':service_list}

    return render(request, 'accounts/service_list.html',context)

template

            <div class="card card-body">
                    <table class="table">
                        <tr>
                            <th>SKU</th>
                            <th>Service Name</th>
                            <th>Number of Ordered</th>

                        </tr>

            {% for i in service_list %}



                            <tr>
                                <td>{{i.service_sku}}</td>
                                <td>{{i.name}} </td>
                                <td></td>

                            </tr>

                            {% endfor %}

Я хочу отображать количество заказов каждого экземпляра, учитывая, что модель заказа имеет внешний ключ из сервисная модель.

Набор запросов должен быть таким, как показано ниже.

Order.objects.all().filter(service__id =3).count()

Проблема в том, что я должен указать, какой идентификатор этой модели будет для этого набора запросов для работы.

Я попытался поместить формат набора запросов ниже в шаблон

{{Order.objects.all().filter(service__id=i.id).count()}

В шаблоне это будет выглядеть так, как показано ниже

template

            <div class="card card-body">
                    <table class="table">
                        <tr>
                            <th>SKU</th>
                            <th>Service Name</th>
                            <th>Number of Ordered</th>

                        </tr>

            {% for i in service_list %}



                            <tr>
                                <td>{{i.service_sku}}</td>
                                <td>{{i.name}} </td>
                                <td>{{Order.objects.all().filter(service__id=i.id).count()}}</td>

                            </tr>

                            {% endfor %}

Выше реализация не работает.

Какой метод идеально подходит для этой ситуации?

1 Ответ

1 голос
/ 17 июня 2020

Вы не можете вызывать методы (с параметрами) в шаблоне Django. Шаблоны намеренно ограничены, чтобы люди не могли писать бизнес-логи c в шаблонах.

Вы можете .annotate(&hellip;) [Django -doc] queryset для получения количества связанных Order s:

from django.db.models import Count

def service_list(request):
    service_list = Service.objects.annotate(
        <b>norders=Count('order')</b>
    ).order_by('service_sku')
    context = {'service_list':service_list}
    return render(request, 'accounts/service_list.html',context)

В шаблоне вы можете отобразить это с помощью:

{% for i in service_list %}
<tr>
    <td>{{ i.service_sku }}</td>
    <td>{{ i.name }} </td>
    <td>{{ i.<b>norders</b> }}</td>
</tr>
{% endfor %}
...