2016-03-08 52 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天內給它,對不起... –