我试图将带有主模型的子模型计数信息发送到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
答案 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 }}
获取公司数量。但是这种方法太慢了。因为对于每个项目记录,您都有数据库命中。