【问题标题】:Efficient Django querying across models denoting relationships跨表示关系的模型的高效 Django 查询
【发布时间】:2014-09-14 01:49:38
【问题描述】:

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

如果需要,我愿意更改模型,但如果有一种有效的方法可以对现有模型执行此操作,我会喜欢它。

【问题讨论】:

    标签: python django django-models django-queryset


    【解决方案1】:

    我想通了。最简单的方法是使用多对多关系重新制作模型:

    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)
    

    【讨论】:

      猜你喜欢
      • 2011-09-20
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      • 2019-04-22
      相关资源
      最近更新 更多