django中的多对多“代理”关系

时间:2011-09-07 22:15:14

标签: django join models

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

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中,我会简单地加入三个表并从每个表中选择适当的信息。

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

1 个答案:

答案 0 :(得分:0)

在django中,查询是在模型对象上完成的,它的井documented。查询或查询集是惰性的,当它们执行时,它们通常会返回一个dict列表,列表中的每个dict都包含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')

请注意,我使用的模型SourceDestination的较小案例名称与ForeignKeyUser关系,这将加入所有三个表格查看其丰富的文档。

修改

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

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

这应该在所有表上进行内连接。

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

希望有所帮助。 :)