如何将子字段计数添加到Django ORM模型?

时间:2018-09-11 02:04:02

标签: django django-models

我试图将带有主模型的子模型计数信息发送到HTML模板。我有PROJECT和Companies模型:

# Make the the encoding is correct
export LANG=en_US.UTF-8

# Remove & Copy assets
rm -r ${XCS_SOURCE_DIR}/ipa
cp -R ${XCS_OUTPUT_DIR}/ExportedProduct/Apps/ ${XCS_SOURCE_DIR}/ipa/

# Release the archive
${XCS_PRIMARY_REPO_DIR}/Pods/Crashlytics/submit <API> <Key> -ipaPath ${XCS_SOURCE_DIR}/ipa/AppName.ipa -groupAliases groupName -notifications YES

我需要说明,项目有多少家公司(公司数):

class Projects(models.Model):
    name = models.CharField(max_length=255)
    note = models.CharField(max_length=255, default='')
    def __str__(self):
        return self.name

class Companies(models.Model):
    project = models.ForeignKey(Projects, on_delete=models.CASCADE)
    name = models.CharField(max_length=255)
    note = models.CharField(max_length=255, default='')
    def __str__(self):
        return self.name

3 个答案:

答案 0 :(得分:2)

方法1::使用 GROUP BY 语句和Django ORM

from django.db.models import Count

Projects.objects.values('name').annotate(count=Count('companies'))

这等效于SQL查询SELECT name,Count('companies') as count from Projects。这将返回 QuerySet

<QuerySet [{'name': 'project_name_1', 'count': 10}, {'name': 'project_name_2', 'count': 6}]>



方法2::使用@property装饰器(如@Kirollos Morkos所述)
因此,您的模型变成了

class Projects(models.Model):
    name = models.CharField(max_length=255)
    note = models.CharField(max_length=255, default='')

    @property
    def company_count(self):
        return self.companies_set.count()

    def __str__(self):
        return self.name

然后您将通过 {{ project_obj.company_count}} 在模板中获得公司信息量

注意 Method-1 更加 高效快捷 ,因为它是在中完成的数据库级别

答案 1 :(得分:0)

您可以使用property装饰器在Project模型上提供任意的吸气剂。在您的Company模型中,向related_name外键添加一个project,以便获得相反的关系:

project = models.ForeignKey(Projects, on_delete=models.CASCADE, related_name='companies')

然后,您可以在Project模型上添加属性以获取公司数量:

class Projects(models.Model):
    @property
    def company_count(self):
        return self.companies.count()

    ...

# Following the sample counts you gave
print(project1.company_count)  # 3
print(project2.company_count)  # 5

答案 2 :(得分:0)

正如JPG所说,您可以使用注释。您不需要添加值queryset。见下文:

from django.db.models import Count

Projects.objects.filter(<any filter apply to queryset>).annotate(company_count=Count('companies'))

您可以将任何字段添加到注释中。然后在您的模板或任何代码中,您可以通过以下方式使用此计数:

project.company_count

您还可以添加模板

{{ project.companies_set.count }}

获取公司数量。但是这种方法太慢了。因为对于每个项目记录,您都有数据库命中。