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/Django
的lint
。但这可能需要一些额外的工作,所以可能还没有完成。
你是这个 flake8-django 背后的人吗?如果您/他们决定做这样的事情,我很乐意做出贡献。以上是关于Django 忽略模型字段的主要内容,如果未能解决你的问题,请参考以下文章
如何忽略在 django admin list_display 中加载巨大的字段?
django heroku makemigrations 忽略模型的变化