2016-02-11 2 views
0

Я реализовал некоторые модели и миграции в базу данных postgreSQL9.4. У меня есть несколько моделей. Для примера SkillLevelRuleModel:Ошибка целостности объекта Django 1.8 - поле модели нарушено не-нулевым ограничением

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 было задано в начале. Зачем? Эта модель сохраняет правила или, допустим, пороговые значения. Они действительны с самого начала, когда модель создается. Возможно, в какой-то момент, когда система работает, администратор любит менять некоторые правила. Поэтому он должен уметь указывать до тех пор, пока определенное правило не будет VALID (validTO).

ответ

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

auto_now_add похоже на auto_now, но добавляет «сейчас» только один раз, когда запись создана. Если вы используете auto_now, он сохранит для первоначального добавления, как и функцию auto_now_add, а затем продолжит обновление до «теперь» для каждого обновления записи.

Кажется, в этом поле есть нуль, который не должен быть нулевым, возможно, из-за этого неправильного определения.

  1. Исправить поле.
  2. Загрузите данные
  3. Пропустите все объекты и сохраните(). Это добавит теперь datetime к отсутствующим строкам.
  4. Теперь вы можете удалить blank = True, null = True, makemigrations и migrate.

Для цикла и сохранить (шаг 3) создать следующий питон скрипт и запустить его из оболочки:

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() 
+0

Это не решает мою проблему. Даже если у меня есть поле (auto_now = True), ошибка целостности все еще появляется ... Может быть, что-то не так с моим прибором? Я имею в виду, что я создаю модель, а затем хочу загрузить ее с исходными данными. Но в этой initial_data дата 'validTo' не требуется. Как мне это сделать? – Dante

+0

Существует запись без поля validTo, которая не должна быть нулевой, но она есть. Возможно, неправильное определение вызвало это. –

+0

Извините, но решение, которое вы предоставили, показалось мне излишним. Поэтому я попробовал что-то другое, что сработало для меня в конце. Я просто определил DateTimeField следующим образом: 'validTo = models.DateTimeField (blank = True, null = True)' Как я могу вручную установить поле validTo всякий раз, когда захочу. – Dante

Смежные вопросы