在Django中使用through查询多对多关系

时间:2013-07-17 03:38:14

标签: django django-models django-queryset django-orm

我是Django的新手,我正在尝试构建这个查询。

  • 我有 BaseProfile OneToOne 字段连接到用户
  • 我将 CustomerProfile 中与 OneToOne 字段相关联的个人资料专门用于 BaseProfile
  • CustomerProfile 与其他 CustomerProfile (自身)通过 RelatedCustomer有 ManyToMany 关系模特。
  • RelatedCustomer 中,我指定 from_customer to_customer 外键



也许你可以更好地理解图像。

enter image description here

我的问题
鉴于user.id我需要知道他所连接的客户的所有其他user.id (因此通过 from_customer to_customer ):

所以基本上,首先我需要使用反向查找从User切换到RelatedCustomer,获取所有设置,然后返回知道每个 user.id 顾客在集合中。

EDIT2:

到目前为止我所得到的:

# This gives me back a customer profile given a user.id (2)
cm = CustomerProfile.objects.get(base_profile__user=2)

# M2M lookup. Given one customer returns all the RelatedCustomer relations
# that he has as a part of the 'from' M2M
cm.from_photographer.all()

链接前两个:给定 user.id ,我获得了与CustomerRelated关系的 queryset

rel = CustomerProfile.objects.get(base_profile__user=2).from_photographer.all()

这给了我类似的东西:

[<CustomerRelated: from TestCustomer4 to TestCustomer2 >, 
 <CustomerRelated: from TestCustomer4 to TestCustomer3 >]

在这种情况下, user.id = 2 的用户是 TestCustomer4

我的问题:

到目前为止一切都那么好,但现在有了这个设置我如何才能获得 to_customer 所有user.id ? 也就是说,如何获得TestCustomer2TestCustomer3 user.id

2 个答案:

答案 0 :(得分:4)

首先,这不是您在django中查询数据库的方式。其次(因为你正在学习),最好指出你可以运行dbshell来尝试不同的东西。最后,文档中描述了这种问题。

我告诉你这个,因为作为一个初学者,我也觉得在整个事情中导航有点困难。查找内容的最佳方法是使用google,最后添加 django

我知道你的感受,文档搜索糟透了,对吗?嘿,我觉得你,这就是为什么你总是按我描述的方式搜索。一旦掌握了文档,您就会觉得文档标题页更加直观。

好的,现在回答: 要访问ManyToManyOneToOneForeignKey字段,您需要使用__通常称为 dunder

所以,这就是 I 这样做的方式。请注意,还有其他方法,可能更好的方法:

thing_I_want = RelatedCustomer.objects.get(to_customer__id=2)

但请注意,如果您想获得客户列表,请使用filter()。这是一个例子(以购买数量为例):

things_I_want = RelatedCustomer.objects.filter(to_customer__no_of_purchases=16)

另请注意,过滤器的优点在于您将一个过滤器堆叠在另一个过滤器之上。您可以在我在下面提供的文档链接中阅读有关这些功能的更多信息。

那会得到你想要的东西。现在,您可能会对此有更多疑问,以及它们如何协同工作。不用担心,请点击this documentation link查看。

修改 看起来你想做的事情可以通过django完成,但如果你想用sql来做,那么这也是可能的。例如,SomeModel.objects.raw("SQL_HERE")。表的名称通常为<app>_<model>

但是,您所问的也可以使用ORM在django中完成。但这很棘手。

答案 1 :(得分:0)

好的,像往常一样,只要你得到答案,它总是比你期望的容易得多。

我想这对我有用:

User.objects.filter(base_profile__customer_profile__to_customer__in=
User.objects.get(id=2).base_profile.customer_profile.from_customer.all())

非常感谢@Games Brainiac