2016-03-08 61 views
3

我有一个模型Personne每个人可以通过PersonneRelation模型被链接到另一个人:Django的优化查询

class Personne(BaseModel): 
    user = models.OneToOneField(User) 
    relations = models.ManyToManyField('self', through='PersonneRelation', 
             symmetrical=False, 
             related_name='personne_relations') 

class PersonneRelation(BaseModel): 
    type_relation = models.IntegerField(
     choices=[(a, b) for a, b in list(PersonneEnums.TAB_RELATIONS.items())], 
     default=PersonneEnums.RELATION_FRIEND) 
    src = models.ForeignKey('Personne', related_name='relation_src') 
    dst = models.ForeignKey('Personne', related_name='relation_dst') 
    is_reverse = models.BooleanField(default=False) 

所以,想象一个人A。他有一个联系人B。我的客户希望我显示B的所有联系人,以便A可能能够向这些联系人发送消息。挺容易。问题是我已经提出了一个显示“人员”信息的视图,它非常简单,如/person/{id}。因此,如果您更改{id}值,则可以查看其他人员信息。我需要检查的是:

  • 如果以显示人的A
  • 联系人如果显示该人是接触...的接触A

现在我正在做一个丑陋的查询,我检查所有的联系人的所有联系人...所有的联系人的A

你将如何做一个优化的查询,以检查是否显示的人是联系人的联系人的联系人的A

+0

您还可以添加您为上述两种情况编写的查询吗? – AKS

回答

0

返回True,如果user可以看到other的信息。 userotherauth.User的实例。

user.personne.relations.filter(
    Q(user=other) | Q(relations__user=other) 
).exists() 
+0

哇好主意我会尽快检查 –

+0

@OlivierPons它工作吗? – vsd

+0

还没有时间来测试,我会在10天内给它,对不起... –