我已经实现了一些模型并迁移到我的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)。
答案 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,可能是因为这个错误的定义。
循环并保存(步骤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()