在模型中组织长列表的好方法是什么?

2024-09-27 23:20:02 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是我如何声明我的选择字段:

class Personne(models.Model):

    NIVEAU_ETUDE_PETITE_ENFANCE = u'0'
    NIVEAU_ETUDE_PRIMAIRE = u'1'
    NIVEAU_ETUDE_SECONDAIRE_1ER_CYCLE = u'2'
    NIVEAU_ETUDE_SECONDAIRE_2ND_CYCLE = u'3'
    NIVEAU_ETUDE_POST_SECONDAIRE = u'4'
    NIVEAU_ETUDE_SUPERIEUR_CYCLE_COURT = u'5'
    NIVEAU_ETUDE_SUPERIEUR_LICENCE = u'6'
    NIVEAU_ETUDE_MASTER = u'7'
    NIVEAU_ETUDE_DOCTORAT = u'8'
    NIVEAU_ETUDE_AUTRE = u'9'
    TAB_NIVEAU_ETUDE = {
        NIVEAU_ETUDE_PETITE_ENFANCE: _(
            u'Early childhood education ("less than primary" '
            u'for educational attainment)'),
        NIVEAU_ETUDE_PRIMAIRE: _(
            u'Primary education'),
        NIVEAU_ETUDE_SECONDAIRE_1ER_CYCLE: _(
            u'Lower secondary education'),
        NIVEAU_ETUDE_SECONDAIRE_2ND_CYCLE: _(
            u'Upper secondary education'),
        NIVEAU_ETUDE_POST_SECONDAIRE: _(
            u'Post-secondary non-tertiary education'),
        NIVEAU_ETUDE_SUPERIEUR_CYCLE_COURT: _(
            u'Short-cycle tertiary education'),
        NIVEAU_ETUDE_SUPERIEUR_LICENCE: _(
            u'Bachelor’s or equivalent level'),
        NIVEAU_ETUDE_MASTER: _(
            u'Master’s or equivalent level'),
        NIVEAU_ETUDE_DOCTORAT: _(
            u'Doctoral or equivalent level'),
        NIVEAU_ETUDE_AUTRE: _(
            u'Other'), }

然后我创建这样的组合:

niveau_etudes = models.CharField(max_length=1,
                                 choices=[(a, b) for a, b in
                                          list(TAB_NIVEAU_ETUDE.items())],
                                 default=NIVEAU_ETUDE_PRIMAIRE,
                                 null=True, blank=True)

问题是我的当事人刚刚<八个这样的字段(这是最短的一个!)。所以我不能把所有这些“静态”值放在模型文件中,因为它将变得不可读

如何解决这个问题


Tags: ormodelspostlevelequivalentsecondaryeducationcycle
2条回答

我是这样做的:

我创建了另一个类,每次我想要引用“常量”时,我就调用我的类,例如:

class Personne(models.Model):
    sexe = models.CharField(max_length=1,
                            choices=[(a, b) for a, b in
                                     list(PersonneEnums.TAB_SEXE.items())],
                            default=PersonneEnums.SEXE_HOMME)

这是我的类,它只包含翻译后的常量:

class PersonneEnums(object):
    SEXE_HOMME = u'0'
    SEXE_FEMME = u'1'
    TAB_SEXE = {SEXE_HOMME: _(u'Male'),
                SEXE_FEMME: _(u'Female'), }

    EST_NON_FUMEUR = u'0'
    EST_FUMEUR = u'1'
    EST_FUMEUR_OCCASIONNEL = u'2'
    EST_FUMEUR_AUTRE = u'3'
    TAB_EST_FUMEUR = {EST_NON_FUMEUR: _(u'Non-smoker'),
                      EST_FUMEUR: _(u'Smoker'),
                      EST_FUMEUR_OCCASIONNEL: _(u'Social smoker'),
                      EST_FUMEUR_AUTRE: _(u'Other'),
                      }

我会这样做:

#/usr/bin/python

class Personne: 
    pass

names = ["PETITE_ENFANCE", "PRIMAIRE", "SECONDAIRE_1ER_CYCLE",
    "SECONDAIRE_2ND_CYCLE", "POST_SECONDAIRE", "SUPERIEUR_CYCLE_COURT",
    "SUPERIEUR_LICENCE", "MASTER", "DOCTORAT", "AUTRE"]

descrpitions = ('Early childhood education ("less than primary" for educational attainment)',
                "Primary education", "Lower secondary education",
                "a", "a", "a", "a", "a", "a", "a", "a", "a", )
for i, name in enumerate(names):
    setattr(Personne, "NIVEAU_ETUDE_" + name, unicode(i))

TAB_NIVEAU_ETUDE = {i: (descrpitions[i]) for i, name in enumerate(names)}
setattr(Personne, "TAB_NIVEAU_ETUDE", TAB_NIVEAU_ETUDE)

print Personne.NIVEAU_ETUDE_PETITE_ENFANCE
print Personne.NIVEAU_ETUDE_DOCTORAT
print TAB_NIVEAU_ETUDE

输出:

0
8
{0: 'Early childhood education ("less than primary" for educational attainment)', 1: 'Primary education', 2: 'Lower secondary education', 3: 'a', 4: 'a', 5: 'a', 6: 'a', 7: 'a', 8: 'a', 9: 'a'}

不知道上面代码中的u2;()是什么可能是某个变量/函数,但不管怎样它都应该工作

相关问题 更多 >

    热门问题