Django 1.8夹具完整性错误 - 非空约束

时间:2016-02-11 09:04:03

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

我已经实现了一些模型并迁移到我的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字段。为什么?此模型保存规则或让我们说出阈值。它们在实例化模型时从一开始就有效。也许在系统运行的某个时刻,管理员喜欢改变一些规则。因此,他应该能够指定直到某个规则WAS VALID(validTO)。

1 个答案:

答案 0 :(得分:0)

validTo = models.DateTimeField(auto_now=True,blank=True,null=True)

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

这个字段中似乎有一个null,它不应该为null,可能是因为这个错误的定义。

  1. 修复该字段。
  2. 加载数据
  3. 遍历所有对象,然后保存()。这会将现在的日期时间添加到缺失的行中。
  4. 现在您可以删除blank = True,null = True,makemigrations和migrate。
  5. 循环并保存(步骤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()