【问题标题】:Django model choice field default value not workingDjango模型选择字段默认值不起作用
【发布时间】:2017-10-30 16:08:00
【问题描述】:

我正在开发一个基本的 Django 站点。

我在 models.py 文件中添加了一个名为“status”的模型字段,如下所示:

from django.db import models

class Person(models.Model):

    USED_STATUS = (
        ('Y', 'Used'),
        ('N', 'Not used'),
    )

    status = models.CharField(max_length=1, choices=USED_STATUS, default=USED_STATUS[1][0])

但是当我 phpmyadmin 进入数据库时​​,'status' 模型字段的默认值是 None,应该是 'N'。 此外,当我尝试使用 Python SQL 脚本将记录 INSERT 插入同一个数据库表时,它会引发错误:“Warning: (1364,”Field 'status' doesn't have a default值")"。我已经搜索了整个论坛,但找不到任何类似的问题,请帮助。

【问题讨论】:

  • 您应用迁移了吗?
  • 是的,我已多次应用迁移。即使我尝试删除状态字段,应用迁移,然后重新创建状态模型字段,然后再次应用迁移。
  • 默认只有Django使用,it is not set in the database。如果使用 phpmyadmin 或不使用 ORM 的 Python 脚本,则不会使用默认值。
  • 好的,谢谢,这解释了这种行为。有什么方法可以使用其他脚本插入值而不干扰 Django 的默认选项?我可以使用脚本插入值“N”吗?
  • 大多数数据插入使用 django ORM 可能更可靠。如果直接操作数据库,最终可能会出现不一致的架构。

标签: python django django-models


【解决方案1】:

模型中添加的默认值不会反映在生成的 SQL DDL 语句中。最有可能是这种方式,因为没有什么能阻止人们使用可调用对象作为默认值,这些可调用对象运行复杂的代码来找出默认值。 callables 显然不能被替换到数据库中。

最好直接使用 ORM。如果您希望使用独立 python 脚本中的 Django ORM 与您的数据库通信,您可以初始化脚本并调用 import django; django.setup(),这将确保您可以导入模型并通过 ORM 运行查询。

注意:您可能必须导出 DJANGO_SETTINGS_MODULE 环境变量才能使其工作。

【讨论】:

  • 这似乎是最好的替代解决方案。谢谢,我会在这里尝试更新状态。
猜你喜欢
  • 2018-10-20
  • 2014-12-07
  • 2020-10-03
  • 2012-04-18
  • 1970-01-01
  • 2014-04-11
  • 2015-05-15
  • 2010-10-19
  • 2017-01-28
相关资源
最近更新 更多