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

2024-06-01 01:33:13 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个像这样的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”)

对于我的男朋友,我怎样才能有效地找到所有与我的男朋友没有友谊的人?你知道吗

我可以这样做,但必须有一种更友好、更高效的方法:

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

如果需要的话,我愿意改变这个模型,不过如果有一个有效的方法来使用现有的模型,我会喜欢的。你知道吗


Tags: namein模型truemodelsmyclassperson
1条回答
网友
1楼 · 发布于 2024-06-01 01:33:13

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

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)

相关问题 更多 >