Django的选择领域并不匹配

时间:2017-10-01 13:55:08

标签: python django django-models

我有2个模型使用选择元组具有相同的字段,但是当我比较它们时,它们并不相等。

TEAM_CHOICES = (
    ('ANA', 'Anaheim'),
    ('ARI', 'Arizona'),
)


class GameData(models.Model):
    player_name = models.CharField(max_length=50)
    team = models.CharField(max_length=3, choices=TEAM_CHOICES)
    goals_scored = models.SmallIntegerField()


class GameResult(models.Model):
    date = models.DateField('game date')
    away_team = models.CharField(max_length=3, choices=TEAM_CHOICES)
    home_team = models.CharField(max_length=3, choices=TEAM_CHOICES)

然而,当我进入我的控制台并做:

>> GameData.objects.first().team
u'ARI'
>> GameResult.objects.first().away_team
u'Arizona'

我通过调试发现,当我使用Django的ORM来创建这些数据时,我忘了使用团队名称的首字母缩略词。但是,该领域的max_length属性是否应该首先阻止这样的事情发生?

编辑/解决方案:我使用的SQLite并没有强制实施VARCHAR限制。

2 个答案:

答案 0 :(得分:1)

你的问题与你的声明有关。以下是您应该如何声明和使用选择:通过IntegerField不是CharField。您可以使用以下示例轻松调整代码:

class QuestionType(BaseModel):
    Q_TYPE_BEFORE = 1
    Q_TYPE_DURING = 2
    Q_TYPE_AFTER = 3

    TAB_Q_TYPE = {
        Q_TYPE_BEFORE: _("BEFORE"),
        Q_TYPE_DURING: _("DURING"),
        Q_TYPE_AFTER: _("AFTER"),
    }
    q_type = models.IntegerField(
        choices=[(a, b) for a, b in list(TAB_Q_TYPE.items())],
        default=Q_TYPE_BEFORE)

    label = models.CharField(max_length=200, default=None,
                             blank=True, null=True)

    def __str__(self):
        return '{}'.format(self.label if self.label else _('(empty)'))

答案 1 :(得分:0)

您必须了解Django模型的工作原理。

Django模型就像数据库上方的层一样。现在,将验证通过此图层的任何内容。也就是说,每当您创建模型类的模型实例(稍后由django或您明确调用save())时,模型将被验证并保存到数据库中。

但是,当您直接将某些数据导入数据库时​​(因为您已经完成了),正如您现在可能已经意识到的那样,它从未经历过您的django模型层。因此,没有创建任何模型实例。 由于未创建任何模型实例,因此从未验证过它。

希望它有所帮助。感谢。

相关问题