【问题标题】:When displaying foreign key base Queryset on template在模板上显示外键基础查询集时
【发布时间】:2020-06-17 18:51:40
【问题描述】:

我有两个模型如下所示

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

问题是我必须指定该模型的哪个 id 才能使该查询集工作。

我尝试将下面的查询集格式放入模板中

{{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 %}

上述实现不起作用。

哪种方法最适合这种情况?

【问题讨论】:

  • 您不能在 Django 模板中调用方法(带参数)。故意限制模板以防止人们在模板中编写业务逻辑。
  • 明白了,如何显示“每个实例的订单数”?

标签: python django django-views django-templates


【解决方案1】:

您不能在 Django 模板中调用方法(带参数)。故意限制模板以防止人们在模板中编写业务逻辑。

您可以通过.annotate(…) [Django-doc]查询集来获取相关的数量 Orders:

from django.db.models import Count

def service_list(request):
    service_list = Service.objects.annotate(
        norders=Count('order')
    ).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.norders }}</td>
</tr>
{% endfor %}

【讨论】:

  • 谢谢先生。欣赏它
猜你喜欢
  • 1970-01-01
  • 2018-04-29
  • 2016-04-17
  • 1970-01-01
  • 2023-03-07
  • 2015-07-30
  • 2020-10-29
  • 2021-12-28
  • 2021-11-17
相关资源
最近更新 更多