django查询select_related span关系

时间:2013-03-25 19:43:57

标签: django join

嗯,有一个复杂的查询。 假设我们有3张桌子。

class Logs:
    user = ForeignKey(User)
    ...

class User:
    name = CharField()
    ...

class User_Info:
    user = ForeignKey(User)
    address = CharField()
    ...

我想要做的是通过User关联表Logs和User_Info。 基本上,我想进行连接,以获取一个新表,其中包含来自User_Info的Logs,User和address中的所有字段。我知道select_related。但它只能组合日志和用户。

如何使用User_Info?我想最小化数据库调用。所以理想的答案应该是一个数据库命中。

编辑: 我很感激下面的回答。我只是想为这个问题提出最终解决方案。

如果您确实有一些复杂的查询,只需使用objects.raw()。它将解决你的大多数问题。

2 个答案:

答案 0 :(得分:1)

<强> models.py

class User:
    name = CharField()

    def logs(self):
        return Logs.objects.filter(user=self)

    def info(self):
        return User_Info.objects.filter(user=self)

<强> views.py

users = User.objects.filter()        

<强>模板

{% for user in users %}
    {{ name }}

    {% for log in user.logs %}
        //log fields
    {% endfor %}

    {% for info in user.info %}
        //info fields
    {% endfor %}
{% endfor %}

答案 1 :(得分:0)

首先,数据库调用的数量不一定与代码行数有关 - Queryset API中的许多方法都是惰性的。

看起来您实际上在UserUser_Info之间存在一对一的关系。在这种情况下,您可以使用OneToOneField代替ForeignKey。然后,您可以直接从User模型访问您的信息。看到 https://docs.djangoproject.com/en/dev/topics/db/examples/one_to_one/