对于有选择的django模型字段,如何有效地获取数据库中使用的选项列表?

时间:2012-07-16 13:14:42

标签: django

我只是在django query-fu的棕色腰带。所以也许我在这里不知道一些新的技巧。

这是我的模特:

SCHOOL_TYPES = (('elementary', 'Elementary Schools'), ('middle', 'Middle Schools'), ('junior_high', 'Junior High Schools'), ('high_school', 'High Schools'), ('other', "Other"))

class School (BaseSlugModel):
    name=CharField(max_length=100)
    school_type = models.CharField(max_length=20, choices=SCHOOL_TYPES)

出于UI的目的,我想编写一个函数get_active_school_types,它返回一个有一个或多个学校的SCHOOL_TYPES元组的子集。有没有比蛮力更有效的方法,获取所有学校,然后循环使用方法?

编辑:根据Simeon的回答,这是我的解决方案:

active_types = School.objects.values_list('school_type', flat=True).distinct()
return [ school_type for school_type in SCHOOL_TYPES if school_type[0] in active_types]

1 个答案:

答案 0 :(得分:2)

您可以使用QuerySet的distinct方法:

School.objects.order_by('school_type').distinct('school_type')

这将让数据库处理它而不是Python代码。请注意,只有在使用PostgreSQL时,才能将字段名称传递给distinct

您还可以使用values_list

School.objects.values_list('school_type', flat=True).distinct()

这将返回值列表。