【问题标题】:Django 1.8 Fixture Integrity Error - Model field is violated by not-null constraintDjango 1.8 Fixture Integrity Error - 模型字段被非空约束违反
【发布时间】:2016-05-21 23:10:09
【问题描述】:

我已经在我的 postgreSQL9.4 数据库中实现了一些模型和迁移。我有一些模型。例如 SkillLevelRuleModel:

class SkillLevelRule(models.Model):
skillLevelRuleID = models.AutoField(primary_key=True)
skillCategoryID = models.ForeignKey(SkillCategory, default=1)
skillLevelID = models.ForeignKey(SkillLevel, default=1)
threshold = models.IntegerField()
validFrom = models.DateTimeField(default=datetime.now)
validTo = models.DateTimeField(auto_now_add=False, auto_now=True)

现在我对以下字段有疑问:

validTo = models.DateTimeField(auto_now_add=False, auto_now=True)

所以在模型创建的时候它应该没有值,但是一旦模型中的条目被更新,validTO应该被更新。

一旦我创建了模型(makemigrations,migrate),我想加载一个 initial_data.json 来加载初始数据。

很遗憾,我收到以下错误:

Could not load rewardsystem.SkillLevelRule(pk=6): null value in column "validTo" violates not-null constraint
DETAIL:  Failing row contains (6, 2, 2016-02-11 08:46:29.267201+00, null, 1, 1).

我的 .json 文件和该模型的相应条目如下所示:

{
    "model": "rewardsystem.SkillLevelRule",
    "pk": 6,
    "fields":{
        "skillCategoryID" : "1",
        "skillLevelID" : "1",
        "threshold" : "2"
    }
},

我不明白为什么会发生这种情况以及我应该如何防止它。我不希望在开始时设置 validTo 字段。为什么?这个模型保存了规则,或者说是阈值。当模型被实例化时,它们从一开始就有效。也许在系统运行的某个时刻,管理员喜欢更改一些规则。因此,他应该能够指定某个规则何时有效(validTO)。

【问题讨论】:

    标签: python json django error-handling django-fixtures


    【解决方案1】:
    validTo = models.DateTimeField(auto_now=True,blank=True,null=True)
    

    auto_now_add 类似于 auto_now,但它只在创建记录时添加一次“now”。如果您使用 auto_now,它将保存初始添加,就像 auto_now_add 功能一样,然后在每次记录更新时继续更新到“现在”。

    这个字段好像有一个空,不应该是空,可能是这个错误的定义。

    1. 修复字段。
    2. 加载数据
    3. 遍历所有对象,然后保存()。这会将现在的日期时间添加到缺失的行中。
    4. 现在您可以删除 blank=True、null=True、makemigrations 和 migrate。

    要循环和保存(第 3 步),请创建以下 python 脚本并从 shell 运行它:

    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings") #copy from manage.py
    os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"
    import django
    django.setup()
    from mysite.myapp.models import SkillLevelRule
    q = SkillLevelRule.objects.all()
    for s in q:
       q.save()
    

    【讨论】:

    • 这并不能解决我的问题。即使我有字段 (auto_now=True) 仍然会弹出完整性错误...也许我的夹具有问题?我的意思是我创建了模型,然后我想用初始数据加载它。但在此 initial_data 中,不应要求“validTo”日期。我该怎么做?
    • 有一条记录没有validTo字段,它不应该为null,但它是。也许是错误的定义造成的。
    • 很抱歉,您提供的解决方案对我来说似乎有点矫枉过正。所以我尝试了一些不同的东西,最终对我有用。我刚刚定义了 DateTimeField,如下所示:validTo = models.DateTimeField(blank=True, null = True) 这样我可以随时手动设置 validTo 字段。
    • 没问题,我试着用auto_now回答,这就是问题的最初原因。当然,使用 null 和空白没有问题。
    • 是的。带来不便敬请谅解。不想粗鲁,但我的 Django 知识不是那么先进,所以我不完全理解你的解决方案,所以我无法尝试......
    猜你喜欢
    • 2021-01-21
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 2021-03-30
    • 2021-09-27
    • 2018-08-14
    • 1970-01-01
    相关资源
    最近更新 更多