在Django中过滤相关字段

时间:2013-10-22 02:57:16

标签: django distinct annotate

我开始学习Django,这是我的第一次编程经验。

我有下一个型号:

class Region(models.Model):
    name = models.CharField(u'Region', max_length=254, unique=True)


class Organization(models.Model):
    name = models.TextField(u'Org_name')
    inn = models.CharField(u'INN', max_length=254)
    region = models.ForeignKey(
        Region,
        related_name='org_region',
        blank=True,
        null=True,
        on_delete=models.SET_NULL
        )

class Person(models.Model):
    region = models.ForeignKey(
        Region,
        related_name='p_region',
        blank=True,
        null=True,
        on_delete=models.SET_NULL
        )
    organization = models.ForeignKey(
        Organization,
        related_name='p_org',
        blank=True,
        null=True,
        on_delete=models.SET_NULL
        )
    inn = models.CharField(u'INN', max_length=254)

我需要按区域组织进行分组,其中至少有一个人。 要获得至少有一个我尝试过的人的组织的QS:

Organization.objects.filter(p_org__isnull=False).distinct()
但是,但是,因为这个比例是OneToMany,是不是?

qs = Person.objects.filter(organization__isnull=False)
Organization.objects.filter(p_org__in=qs).distinct()

结果相等,但我不确定第一个版本是否正确。

>>> Organization.objects.filter(p_org__in=qs).distinct().filter(region__name__exact="Region1").count()
12

>>> for i in Organization.objects.filter(p_org__isnull=False).distinct().values('region__name').annotate(count_in_reg=Count('region__name')):
...     print i['region__name'], i['count_in_reg']

Region0 4
Region1 16
Region2 64
...
......

distinct()之后,values()annotate()无法正常工作。 我的错误在哪里,如何获得正确的QS uniq组织,其中至少有一个人没有district()
感谢

1 个答案:

答案 0 :(得分:0)

由于region是Person模型的ForeignKey,因此您可以访问Person模型 通过地区。你可能想试试这个:

Organization.objects.filter(region__p_org__isnull=False).distinct()