【问题标题】:Django: Add subquery to a nested modelDjango:将子查询添加到嵌套模型
【发布时间】:2021-04-22 20:38:45
【问题描述】:

我的项目中有以下模型。一个 SRV 包含许多项目,每个项目包含多个任务。我在模板中详细说明每个 SRV,并显示所有相关项目的列表。

class Srv(models.Model):
    srv_year = models.CharField(max_length=4)

class Project(models.Model):
    srv = models.ForeignKey(Srv, on_delete=models.CASCADE, null=True, blank=True)

class Todo(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE, null=True, blank=True)
    state = models.BooleanField(blank=True, null=True, default=False)

在views.py中我想获取与每个项目关联的已完成任务,但我总是从SRV(主模型)获取与所有项目关联的所有任务

class srvdetail(LoginRequiredMixin, DetailView):
    model = Srv
    template_name = 'srv_detail.html'
    slug_field = 'slug'

更新:

在 Project 模型中添加几个定义,并在模板中打印如下:

class Project(models.Model):
    #...

    def todo_done(self):
        return self.todo_set.filter(state=True).count() * 100 / self.todo_set.all().count()

    def todo_left(self):
        return self.todo_set.filter(state=False).count() * 100 / self.todo_set.all().count()

在我的模板中:

{% for project in srv.project_set.all %}
{{project.todo_done|floatformat:0|intcomma}}% complete
{{project.todo_left|floatformat:0|intcomma}}% left
{% endfor %}

感谢您的 cmets @NKSM

【问题讨论】:

    标签: django model nested django-queryset


    【解决方案1】:

    为什么不这样呢?

    Todo.objects.filter(
        state = <state>,
        project__srv = <srv_instance>
    )
    

    更新:

    模板.html:

    {% for srv in srvs %}
      <div> srv year: {{srv.srv_year}} </div>
      {% for project in srv.project_set.all %}
        <div> project id: {{project.id}} </div>
        {% for todo in project.todo_set.all %}
          {% if todo.state %}
            <div> todo id: {{todo.id}} </div>
          {% endif %}
        {% endfor %}
      {% endfor %}
    {% endfor %}
    

    【讨论】:

    • 对不起,但我不明白如何将其合并到代码中。我了解我必须获取每个项目的任务并将其作为列出的每个项目的上下文发送
    • 我们将您实际上不需要在视图中执行此操作 - 请参阅我更新的答案。
    【解决方案2】:

    试试下面的代码:

    在你看来:

    projects = Project.objects.filter(todo__state=True)
    

    在您的模板中:

    <table>
        <tr>
            <th>srv year</th>
            <th>project ID</th>
            <th>Total number of completed tasks</th>
        </tr>
        {% for project in projects %}
        <tr>
            <td>{{ project.srv.srv_year }}</td>
            <td>{{ project.pk }}</td>
            <td>{{ project.todo_set.count }}</td>
        </tr>
        {% enfor %}
    </table>
    

    【讨论】:

    • 如何将此值发送到模板中的每个项目? cli 上的 Django 系统正确检测到与 SRV 关联的每个项目的已完成任务数
    • @Drennos,我已经更新了我的答案。这应该可行。
    • 我设法通过在我的模型中添加定义将额外的内容发送到我的模板
    猜你喜欢
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2017-11-08
    • 1970-01-01
    相关资源
    最近更新 更多