Найти - Пользователи
Полная версия: Странное поведение при сохранении экземпляра модели в БД
Начало » Django » Странное поведение при сохранении экземпляра модели в БД
1
aidaho
В случае апдейта записи в БД происходит следующее:
>>> 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()
Помогите пожалуйста понять, где допущена ошибка.
sergeek
ну пишет же
IntegrityError: PRIMARY KEY must be unique
в бд уже есть запись с таким primary key
FishHook
Ну, разумеется, есть, раз он эту запись в первой строчке извлекает!
Похоже на то, что вместо апдейта джанга почему-то делает инсерт.
ТС, попробуй в сейве явно указать force_update=True
aidaho
Похоже на то, что вместо апдейта джанга почему-то делает инсерт.
Да, я тоже так считаю.
ТС, попробуй в сейве явно указать force_update=True
Пробовал, тот же результат. Я смотрел код ModelBase.base_save() джанги и не смог понять, как при исходных условиях происходит то, что происходит.
aidaho
pdb показал, что в force_insert находится ссылка на мой экзепляр, которая возвращает true с предсказуемыми последствиями.
А попала она туда как позиционный параметр вот здесь:
super(LessonCycle, self).save(self, *args, **kwargs)
Всем спасибо, проблема решена.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB