【问题标题】:Django, filter query set through multiple entry_set.all() relationshipsDjango,通过多个entry_set.all()关系过滤查询集
【发布时间】:2016-11-07 11:26:42
【问题描述】:
class Server(models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE)
    ...

class Schedule(models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE)
    ...

class LineItem(models.Model):
    schedule = models.ForeignKey(Schedule, on_delete=models.CASCADE)
    server = models.ForeignKey(Server, blank=True, null=True)
    ...

我的模板中有一些非常讨厌的逻辑,用于在服务器详细信息页面中显示与给定服务器对象相关的任何 LineItems

{% for schedule in server.client.schedule_set.all %}
    {% for lineitem in schedule.lineitem_set.all %}
        {% if lineitem.server == server %}
            {{ lineitem.id }}
            {{ lineitem.description }}
        {% endif %}
    {% endfor %}
{% endfor %}

更新:澄清

我可以通过以下方式从内部获取相关信息:

def serverDetailView(request, pk):
    # Fetches all the line items related to the current server
    server = get_object_or_404(Server, pk=pk)
    line_items = []
    for schedule in server.client.schedule_set.all():
        items = schedule.lineitem_set.all()
        for item in items:
            if item.server == server:
                line_items.append(item)
    context = {'server': server, 'line_items': line_items}
    return render(request, 'reports/server_detail.html', context)

然后在模板中:

{% for item in line_items %}
    {{ item }}
{% endfor %}

问题是,我可以通过单个查询过滤掉这些相关的 LineItem 吗?

【问题讨论】:

    标签: python django django-models django-queryset


    【解决方案1】:

    而不是遵循相反的关系model_set经理。您可以使用 Django ORM 中的双下划线符号来遵循 ForeignKey 关系

    line_items = LineItem.objects.filter(schedule__client=server.client)
    

    【讨论】:

    • 我从来没有想过要这样做!我下班到明天我 99% 这将是我所追求的。谢谢!
    猜你喜欢
    • 2012-11-18
    • 2020-04-13
    • 2019-10-26
    • 2019-09-20
    • 2020-01-24
    • 2019-02-09
    • 2019-11-06
    • 2011-10-09
    • 1970-01-01
    相关资源
    最近更新 更多