Форум сайта python.su
В случае апдейта записи в БД происходит следующее:
>>> from tutortalk.models import LessonCycle >>> c = LessonCycle.objects.get(pk=1) >>> c.name u'How to do absolutely nothing.' >>> c.lesson_cycle_id 1 >>> c.name = 'How to do absolutely everything' >>> c.save() Traceback (most recent call last): File "<console>", line 1, in <module> File "/home/aidaho/Documents/projects/tutortalk/tutortalk/tutortalk/models.py", line 190, in save super(LessonCycle, self).save(self, *args, **kwargs) File "/usr/lib/python2.6/dist-packages/django/db/models/base.py", line 463, in save self.save_base(using=using, force_insert=force_insert, force_update=force_update) File "/usr/lib/python2.6/dist-packages/django/db/models/base.py", line 551, in save_base result = manager._insert([self], fields=fields, return_id=update_pk, using=using, raw=raw) File "/usr/lib/python2.6/dist-packages/django/db/models/manager.py", line 203, in _insert return insert_query(self.model, objs, fields, **kwargs) File "/usr/lib/python2.6/dist-packages/django/db/models/query.py", line 1576, in insert_query return query.get_compiler(using=using).execute_sql(return_id) File "/usr/lib/python2.6/dist-packages/django/db/models/sql/compiler.py", line 910, in execute_sql cursor.execute(sql, params) File "/usr/lib/python2.6/dist-packages/django/db/backends/util.py", line 40, in execute return self.cursor.execute(sql, params) File "/usr/lib/python2.6/dist-packages/django/db/backends/sqlite3/base.py", line 337, in execute return Database.Cursor.execute(self, query, params) IntegrityError: PRIMARY KEY must be unique
class LessonCommon(Model): """ Common fields agregator. """ hours = PositiveIntegerField(help_text=_('Course duration in hours')) # Could be set to academic hour (50 min) , usual (60 min) # or manual (1h 15 min): hour_minutes = PositiveSmallIntegerField(help_text=_('Hour length')) # Break between lessons: minutes_break = PositiveSmallIntegerField(help_text=_('Break length')) class Meta: abstract = True class LessonCycle(LessonCommon): """ A single lesson in the specific educational cycle. A lesson could override (or define more exactly) some of the declared course features. """ def __unicode__(self): return self.name def save(self, *args, **kwargs): """ Denormalization. """ self.course = self.cycle.course self.user = self.lesson.user self.name = self.lesson.name super(LessonCycle, self).save(self, *args, **kwargs) lesson_cycle_id = AutoField(primary_key=True) cycle = ForeignKey('Cycle') # For denormalization course = ForeignKey('Course') lesson = ForeignKey('Lesson') # Denormalization: lesson owner... user = ForeignKey('Teacher') # ...and lesson name name = CharField(max_length=255) # These is a calculated value: date_start = DateTimeField(help_text= _('Current lesson launch time')) date_finish = DateTimeField() # If True, lesson price should be zero. is_free_lesson = BooleanField(default=False) # Flag will be configured by teacher in his course: requests_allowed = BooleanField( help_text=_('Could student send a request on this lesson')) active = BooleanField()
Офлайн
ну пишет же
IntegrityError: PRIMARY KEY must be unique
Офлайн
Ну, разумеется, есть, раз он эту запись в первой строчке извлекает!
Похоже на то, что вместо апдейта джанга почему-то делает инсерт.
ТС, попробуй в сейве явно указать force_update=True
Офлайн
Похоже на то, что вместо апдейта джанга почему-то делает инсерт.Да, я тоже так считаю.
ТС, попробуй в сейве явно указать force_update=TrueПробовал, тот же результат. Я смотрел код ModelBase.base_save() джанги и не смог понять, как при исходных условиях происходит то, что происходит.
Офлайн
pdb показал, что в force_insert находится ссылка на мой экзепляр, которая возвращает true с предсказуемыми последствиями.
А попала она туда как позиционный параметр вот здесь:
super(LessonCycle, self).save(self, *args, **kwargs)
Офлайн