Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 跨表示关系的模型的高效Django查询_Python_Django_Django Models_Django Queryset - Fatal编程技术网

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

Python 跨表示关系的模型的高效Django查询,python,django,django-models,django-queryset,Python,Django,Django Models,Django Queryset,假设我有一个像这样的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="pers

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

如果需要的话,我愿意改变模型,不过如果有一种有效的方法可以用现有的模型做到这一点,我很乐意

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

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)