Django 忽略模型字段

Posted

技术标签:

【中文标题】Django 忽略模型字段【英文标题】:Django ignores model field 【发布时间】:2019-12-31 13:41:11 【问题描述】:

所以,我在做一个项目时遇到了这个问题。

我错误地在我的一个模型中的一个字段之后放置了一个“,”,而 Django 在忽略该特定字段的同时进行了所有迁移。我花了一段时间才意识到在字段之后的一点“,”负责我的字段没有反映在数据库中。

但是,我知道不应该出现昏迷,但我有点期待 Django 给我一个错误或至少一个警告。

可能是这样的: "FieldName 附近的 models.py 中的语法无效"

编辑: “一个或多个模型字段存储为元组/s 你确定要这样做吗?”

但它会忽略该特定字段并继续迁移。我的问题是为什么 Django 会让这种情况发生?这是预期的行为吗,Django 不应该通知这些事情吗?或者为什么要静默传递。

这里有一个例子来看看。

class person(models.Model):
    name = models.CharField(max_length=10)
    surname = models.CharField(max_length=10),
    age = models.PositiveIntegerField()

现在,如果您创建迁移并应用它们,Django 将简单地忽略此处的 surname 字段并应用迁移而不会出现任何错误,为什么会这样?

【问题讨论】:

去掉最后的逗号(,)。通过使用尾随逗号,您将字段包装在 1 元组中。 我知道解决方案,但你能告诉我“你将字段包装在一个 1 元组中”究竟是什么意思吗@WillemVanOnsem 【参考方案1】:

这不是 无效 语法。通过添加尾随逗号,您将字段包装在单例元组中。所以person.surname的类型是tuple

例如,如果你写:

>>> a = 1,
>>> a
(1,)
>>> type(a)
<class 'tuple'>

除了模型字段之外,模型还可以包含各种东西:常量、子类、方法等。

可以在所有字段等中进行详尽的搜索,以检查元组是否包含模型字段,但这可能需要相当长的时间,可能导致评估惰性属性,甚至可能陷入无限状态循环。

不过,它可能是可以添加到flake8-django [GitHub] 的内容。

【讨论】:

好的,但是该元组的用途是什么,它在现实中会是什么样子。使用 Django 模型字段类创建的元组 @Eternal:具有一个元素的元组:您构造的 Django 模型字段(所以这里是 CharField 对象)。 感谢@Willem 提供的知识。现在我懂了。但是,我相信应该有一些机制,比如你不能在字段之间随机输入任何东西或其他东西,我不知道这听起来可能很疯狂。但是有什么限制? @Eternal:嗯,它可能是flake8-django 的一个有价值的扩展,这有点像Python/Djangolint。但这可能需要一些额外的工作,所以可能还没有完成。 你是这个 flake8-django 背后的人吗?如果您/他们决定做这样的事情,我很乐意做出贡献。

以上是关于Django 忽略模型字段的主要内容,如果未能解决你的问题,请参考以下文章

django 'auto_now' 如何忽略指定字段的更新

如何忽略在 django admin list_display 中加载巨大的字段?

Django按两个字段排序项目,但如果它们为零则忽略它们

django heroku makemigrations 忽略模型的变化

makemigrations 忽略所有领域 (DJANGO)

如何忽略 ExtJS 数据模型中的空字段?