У меня есть веб-мастер, который предоставляет словарные объекты данных для ввода в модель Django. Я написал простой скрипт для проверки загрузки данных. Он работает путем итерации по объекту словаря и доставки каждого значения ключа в соответствующее поле модели (ключи делятся своими именами с соответствующими полями модели). Хотя мой новый объект модели принимает данные, они не сохраняются после итерации. Я не могу понять, почему.
In [1]: from events.models import Event
In [2]: eventObject = Event() #New model object to hold the item.
In [3]: item = {'title': 'hellooo', 'description': 'just a test', 'eventid': '412212'} #We want to load this item into the eventObject
In [4]: for k in item.keys():
...: eventObject.k = item[k]
...: print "eventObject.%s: " % (k) + eventObject.k
eventObject.eventid: 412212 #eventObject received the item's data, as to be expected...
eventObject.description: just a test
eventObject.title: hellooo
In [5]: eventObject #but now eventObject is still empty!
Out[5]: <Event: >
In [6]: eventObject.title #just making sure.
Out[6]: ''
In [7]: for k in item.keys():
eventObject.k = item[k]
print "eventObject.%s: " % (k) + eventObject.k
eventObject.save() #Oh, maybe we need to save it...
eventObject.eventid: 412212
---------------------------------------------------------------------------
IntegrityError Traceback (most recent call last)
/home/anthony/Dropbox/Projects/Django/livingCityMap/<ipython console> in <module>()
/usr/local/lib/python2.7/dist-packages/django/db/models/base.pyc in save(self, force_insert, force_update, using)
458 if force_insert and force_update:
459 raise ValueError("Cannot force both insert and updating in model saving.")
--> 460 self.save_base(using=using, force_insert=force_insert, force_update=force_update)
461
462 save.alters_data = True
/usr/local/lib/python2.7/dist-packages/django/db/models/base.pyc in save_base(self, raw, cls, origin, force_insert, force_update, using)
551 if values:
552 # Create a new record.
--> 553 result = manager._insert(values, return_id=update_pk, using=using)
554 else:
555 # Create a new record with defaults for everything.
/usr/local/lib/python2.7/dist-packages/django/db/models/manager.pyc in _insert(self, values, **kwargs)
193
194 def _insert(self, values, **kwargs):
--> 195 return insert_query(self.model, values, **kwargs)
196
197 def _update(self, values, **kwargs):
/usr/local/lib/python2.7/dist-packages/django/db/models/query.pyc in insert_query(model, values, return_id, raw_values, using)
1432 part of the public API.
1433 """
1434 query = sql.InsertQuery(model)
1435 query.insert_values(values, raw_values)
-> 1436 return query.get_compiler(using=using).execute_sql(return_id)
/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.pyc in execute_sql(self, return_id)
789 def execute_sql(self, return_id=False):
790 self.return_id = return_id
--> 791 cursor = super(SQLInsertCompiler, self).execute_sql(None)
792 if not (return_id and cursor):
793 return
/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.pyc in execute_sql(self, result_type)
733
734 cursor = self.connection.cursor()
--> 735 cursor.execute(sql, params)
736
737 if not result_type:
/usr/local/lib/python2.7/dist-packages/django/db/backends/util.pyc in execute(self, sql, params)
32 start = time()
33 try:
---> 34 return self.cursor.execute(sql, params)
35 finally:
36 stop = time()
/usr/local/lib/python2.7/dist-packages/django/db/backends/postgresql_psycopg2/base.pyc in execute(self, query, args)
42 def execute(self, query, args=None):
43 try:
---> 44 return self.cursor.execute(query, args)
45 except Database.IntegrityError, e:
46 raise utils.IntegrityError, utils.IntegrityError(*tuple(e)), sys.exc_info()[2]
IntegrityError: null value in column "eventid" violates not-null constraint
И модель, на случай, если вам интересно:
из django.contrib.gis.db импорт моделей
class Event(models.Model):
title = models.CharField(max_length=200)
description = models.TextField()
eventid = models.IntegerField(max_length=200)
genre = models.CharField(max_length=200)
contact = models.CharField(max_length=200)
cost = models.CharField(max_length=200)
venue = models.CharField(max_length=200)
address = models.CharField(max_length=200)
neighborhood = models.CharField(max_length=200)
city = models.CharField(max_length=200)
date = models.DateTimeField() # This will be replaced by a new class
time = models.CharField(max_length=200) # This should obviously be datetime and probably exist in it's own class, but first requires the input to be normalized (via serious RegEx magic)
def __unicode__(self):
return self.title