我有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限制。
答案 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模型层。因此,没有创建任何模型实例。 由于未创建任何模型实例,因此从未验证过它。
希望它有所帮助。感谢。