【问题标题】:Many-to-many "by proxy" relathionship in djangodjango中的多对多“代理”关系
【发布时间】:2011-09-07 22:15:14
【问题描述】:

我的数据模型由三个主要实体组成:

class User(models.Model):
    ...

class Source(models.Model):
    user = models.ForeignKey(User, related_name='iuser')
    country = models.ForeignKey(Country, on_delete=models.DO_NOTHING)
    description = models.CharField(max_length=100)

class Destination(models.Model):
    user = models.ForeignKey(User, related_name='wuser')
    country = models.ForeignKey(Country)

我正在尝试创建一个查询集,该查询集按用户(多对多)将所有源与目的地连接起来。以这种方式,我将有一个表,其中包含每个用户的所有可能的源/目标组合。 在 SQL 中,我会简单地 JOIN 三个表并从每个表中选择适当的信息。

我的问题是如何执行查询?如何访问查询数据?

【问题讨论】:

    标签: django join models


    【解决方案1】:

    在 django 中查询是在模型对象上完成的,它很好 documented。查询或查询集是惰性的,执行时通常会返回一个字典列表,列表中的每个字典都包含field,后跟value,例如:[{'user':'albert','country':'US and A :) ','description':'my description'},....]

    每个用户的所有可能的来源、目的地组合?

    我认为您必须使用reverse relation ship 来完成此操作,例如:

    my_joined_query = User.objects.values('user','source__country','source__description','destination__country')
    

    请注意,我正在使用与 ForeignKey 关系 User 的模型 SourceDestination 的较小大小写名称,这将 加入所有三个表格文档丰富。

    编辑:

    要进行内部连接,您必须告诉查询,这可以通过在反向模型名称上使用 __isnull=False 来简单地实现:

    my_innerjoined_query = User.objects.filter(source__isnull=False,destination__isnull=False)
    

    这应该对所有表进行内部连接。

    然后您可以像之前一样使用values 选择要显示的内容。

    希望对您有所帮助。 :)

    【讨论】:

    • 谢谢!它成功了。我完全忽略了 values 功能。但是,values 生成左外连接,将空元素添加到结果中。过滤这些只会使查询更加复杂。是否可以让 Django 只使用内部连接做同样的事情?
    • 使用select_related()会确保外键不是null
    • 我应该在什么对象上使用select_related()
    • 尝试在同一查询中使用select_related 而不是values :)
    • 它在我的情况下不起作用,原因有两个:1. select_related 仅支持正向关系 2. 它绑定到单个模型并且不允许从不同的表中选择字段,例如values。到目前为止,我正在使用带有 3 个内部连接的简单原始 SQL 查询
    猜你喜欢
    • 2019-04-27
    • 2013-06-12
    • 2021-01-28
    • 2012-06-30
    • 2010-10-14
    • 2021-09-11
    • 2011-08-22
    • 2011-06-02
    相关资源
    最近更新 更多