Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Странное поведение при сохранении экземпляра модели в БД [RSS Feed]

#1 Ноя. 18, 2012 23:02:41

aidaho
Зарегистрирован: 2012-11-18
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Странное поведение при сохранении экземпляра модели в БД

В случае апдейта записи в БД происходит следующее:

>>> 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()
Помогите пожалуйста понять, где допущена ошибка.

Офлайн

#2 Ноя. 19, 2012 07:51:43

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Странное поведение при сохранении экземпляра модели в БД

ну пишет же

IntegrityError: PRIMARY KEY must be unique
в бд уже есть запись с таким primary key

Офлайн

#3 Ноя. 19, 2012 07:57:01

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Странное поведение при сохранении экземпляра модели в БД

Ну, разумеется, есть, раз он эту запись в первой строчке извлекает!
Похоже на то, что вместо апдейта джанга почему-то делает инсерт.
ТС, попробуй в сейве явно указать force_update=True



Офлайн

#4 Ноя. 19, 2012 08:36:15

aidaho
Зарегистрирован: 2012-11-18
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Странное поведение при сохранении экземпляра модели в БД

Похоже на то, что вместо апдейта джанга почему-то делает инсерт.
Да, я тоже так считаю.
ТС, попробуй в сейве явно указать force_update=True
Пробовал, тот же результат. Я смотрел код ModelBase.base_save() джанги и не смог понять, как при исходных условиях происходит то, что происходит.

Офлайн

#5 Ноя. 19, 2012 13:56:47

aidaho
Зарегистрирован: 2012-11-18
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Странное поведение при сохранении экземпляра модели в БД

pdb показал, что в force_insert находится ссылка на мой экзепляр, которая возвращает true с предсказуемыми последствиями.
А попала она туда как позиционный параметр вот здесь:

super(LessonCycle, self).save(self, *args, **kwargs)
Всем спасибо, проблема решена.

Офлайн

  • Начало
  • » Django
  • » Странное поведение при сохранении экземпляра модели в БД[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version