“多对多”;“委托代理”;django的Relaship

“多对多”;“委托代理”;django的Relaship,django,join,models,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_leng

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

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)
我正在尝试创建一个queryset,它通过用户(多对多)将所有源与目标连接起来。以这种方式,我将有一个表,其中包含每个用户的所有可能的源/目标组合。 在SQL中,我将简单地连接三个表,并从每个表中选择适当的信息


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

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

每个用户的所有可能的源、目标组合

我想你必须用a来完成这件事,例如:

my_joined_query = User.objects.values('user','source__country','source__description','destination__country')
注意,我使用的是与
User
ForeignKey
关系的模型
Source
Destination
的小写名称,这将连接所有三个选项卡浏览其丰富的文档

编辑:

要进行内部联接,您必须告诉查询,只需在反向模型名称上使用
\uu isnull=False
即可:

my_innerjoined_query = User.objects.filter(source__isnull=False,destination__isnull=False)
这应该对所有表进行内部联接

然后,您可以像前面一样使用
选择要显示的内容


希望有帮助。:)

谢谢!它成功了。我完全忽略了价值观的作用。但是,值生成左外部联接,将空元素添加到结果中。过滤这些只会使查询更加复杂。有没有可能让Django只对内部联接执行相同的操作?使用
select\u related()
它将确保foreignkey在我应该在哪个对象上使用
select\u related(),原因有二:一,<代码>选择相关的
仅支持转发关系2。它绑定到单个模型,不允许从不同的表(如
)中选择字段。到目前为止,我使用的是一个简单的原始SQL查询,包含3个内部联接