繁体   English   中英

高效的Django查询表示关系的模型

[英]Efficient Django querying across models denoting relationships

假设我有一个像这样的Django模型:

class Person(models.Model):
  name = models.CharField(max_length=64, blank=True, null=True)
  age = models.IntField(blank=True, null=True)

class Friendship(models.Model):
  person1 = models.ForeignKey('Person', related_name="person1")
  person2 = models.ForeignKey('Person', related_name="person2”)

对于my_guy人,我如何有效地找到所有不与my_guy交友的人

我可以做这样的事情,但是必须有一种更加数据库友好和有效的方式:

friends = []
for friendship in Friendships.objects.filter(Q(person1=my_guy) | Q(person2=my_guy)):
  if friendship.person1 == my_guy:
    friends.append(friendship.person2)
  else:
    friends.append(friendship.person1)
non_friends = []
for p in Persons.objects.all():
  if p not in friends:
    non_friends.append(p)

print non_friends

我愿意根据需要更改模型,尽管如果有一种有效的方法可以对现有模型进行更改,我会很喜欢。

我想到了。 最简单的方法是使用多对多关系重新构建模型:

class Person(models.Model):
  name = models.CharField(max_length=64, blank=True, null=True)
  age = models.IntField(blank=True, null=True)

class Friendship(models.Model):
  members = models.ManyToManyField(Person)

然后就这么简单:

non-friends = Person.objects.exclude(friendship__members=person).exclude(id=person.id)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM