Django优化查询

时间:2016-03-08 00:21:28

标签: django django-models

我有一个模型Personne,每个人都可以通过PersonneRelation模型与另一个人相关联:

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 的联系人的联系人?

1 个答案:

答案 0 :(得分:0)

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

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