Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django';s选项字段don';不匹配_Python_Django_Django Models - Fatal编程技术网

Python Django';s选项字段don';不匹配

Python Django';s选项字段don';不匹配,python,django,django-models,Python,Django,Django Models,我有两个使用选项元组的相同字段的模型,但是当我比较它们时,它们并不相等 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)

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

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限制。

您必须了解Django模型是如何工作的

Django模型就像数据库上方的一层。现在,通过该层的任何内容都将得到验证。也就是说,每当您创建模型类的模型实例时(django或您显式调用后来的
save()
),模型都会被验证并保存到数据库中

但是,当您直接将一些数据导入数据库时(看起来您已经这样做了),正如您现在可能已经意识到的那样,它从未经过django模型层。因此,从未创建任何模型实例由于没有创建模型实例,因此从一开始就没有对其进行验证。


希望能有帮助。谢谢。

您的问题在于您的申报。下面是您应该如何声明和使用选项:通过
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)'))

您可能正在使用SQLite,它不强制执行
VARCHAR
(Django的CharField)的长度,请参阅。此外,正如Shivam正确指出的,您的
选择的验证是由Django完成的,而不是由db完成的。好的,我使用的是SQLite,这似乎是问题所在。谢谢抱歉,澄清一下,通过导入它,我的意思是我使用CSV阅读器解析我的数据和使用Django的ORM保存的对象。@Konrad是的,正如评论中提到的,SQLite不能强制执行VARCHAR长度限制。