如何找到共享多对多关系的模型类型的所有对象?
How can I find all objects of a model type that share a many-to-many-relationship?
所以,我有两个模型 类,让我们使用 django 文档示例并将它们称为 Person 和 Group。它们以多对多的关系相关——一个人可以在多个组中,而组可以有多个人。如果我只有一个 Person 对象,找到与他们共享一个组的所有其他 Person 的最佳方法是什么?
编辑:这是我的代码的松散布局:
class Group(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return self.name
class Person(models.Model):
name = models.CharField(max_length=50)
{various other fields}
groups = models.ManyToManyField(Group)
class Person(models.Model):
name = models.CharField(max_length=255)
details = models.TextField(default='', blank=True)
status_id = models.PositiveSmallIntegerField(default=0)
active = models.PositiveSmallIntegerField(default=1)
class Group(models.Model):
group_name = models.CharField(max_length=255)
persons = models.ForeignKey(
'Person',
on_delete=models.CASCADE,
related_name='group_set'
)
...
in_group_count = (
Person.objects
.filter(status_id__in=[2, 1], active=1)
.annotate(order_num=Count('group_set'))
.filter(order_num__gt=0).count()
)
not_in_group_count = (
Person.objects
.filter(status_id__in=[2, 1], active=1)
.annotate(order_num=Count('group_set'))
.filter(order_num__lte=0).count()
)
in_group_value = (
Person.objects
.filter(status_id__in=[2, 1], active=1)
.annotate(order_num=Count('group_set'))
.filter(order_num__gt=0).values()
)
我不知道这两个模型中哪个模型包含 ManyToMany 字段。它在您的 "Group" 模型中应该有效("person" 作为您的参考人):
qs = Person.objects.filter(group__in=person.group_set.all()).exclude(id=person.pk).distinct()
给你所有的 Person 对象共享一个没有双打的组。如果 m2m 字段在您的 Person 模型中,这应该可以完成工作
qs = Person.objects.filter(groups__in=person.groups.all()).exclude(id=person.pk).distinct()
所以,我有两个模型 类,让我们使用 django 文档示例并将它们称为 Person 和 Group。它们以多对多的关系相关——一个人可以在多个组中,而组可以有多个人。如果我只有一个 Person 对象,找到与他们共享一个组的所有其他 Person 的最佳方法是什么?
编辑:这是我的代码的松散布局:
class Group(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return self.name
class Person(models.Model):
name = models.CharField(max_length=50)
{various other fields}
groups = models.ManyToManyField(Group)
class Person(models.Model):
name = models.CharField(max_length=255)
details = models.TextField(default='', blank=True)
status_id = models.PositiveSmallIntegerField(default=0)
active = models.PositiveSmallIntegerField(default=1)
class Group(models.Model):
group_name = models.CharField(max_length=255)
persons = models.ForeignKey(
'Person',
on_delete=models.CASCADE,
related_name='group_set'
)
...
in_group_count = (
Person.objects
.filter(status_id__in=[2, 1], active=1)
.annotate(order_num=Count('group_set'))
.filter(order_num__gt=0).count()
)
not_in_group_count = (
Person.objects
.filter(status_id__in=[2, 1], active=1)
.annotate(order_num=Count('group_set'))
.filter(order_num__lte=0).count()
)
in_group_value = (
Person.objects
.filter(status_id__in=[2, 1], active=1)
.annotate(order_num=Count('group_set'))
.filter(order_num__gt=0).values()
)
我不知道这两个模型中哪个模型包含 ManyToMany 字段。它在您的 "Group" 模型中应该有效("person" 作为您的参考人):
qs = Person.objects.filter(group__in=person.group_set.all()).exclude(id=person.pk).distinct()
给你所有的 Person 对象共享一个没有双打的组。如果 m2m 字段在您的 Person 模型中,这应该可以完成工作
qs = Person.objects.filter(groups__in=person.groups.all()).exclude(id=person.pk).distinct()