Как обновить базу данных в Django через незаконное промежуточное состояние? - PullRequest
4 голосов
/ 16 декабря 2011

Я пытаюсь изменить некоторые записи базы данных из одного допустимого состояния в другое, но промежуточное (частично обновленное) состояние недопустимо.Например, предположим, что я моделирую лекции, каждая из которых состоит из нескольких коротких тем в некотором порядке:

class Lecture(models.Model):
    slug = models.TextField(
        help_text='Abbreviated name of lecture.'
    )

class Topic(models.Model):
    slug = models.TextField(
        help_text='Abbreviated name of topic.'
    )

    lecture = models.ForeignKey(
        Lecture,
        help_text='The lecture this topic is part of.'
    )

    order = models.IntegerField(
        help_text='Impose ordering on topics.'
    )

    class Meta:
        unique_together = (('lecture', 'order'),)

Мой тестовый пример:

class TestTopicOrder(TestCase):

    def test_reordering_topics(self):

        # The lecture these topics are part of.
        lecture = Lecture(title='Test Lecture', slug='lec')
        lecture.save()

        # Two topics 'zero' and 'one' in that order.
        Topic(lecture=lecture, slug='zero', order=0).save()
        Topic(lecture=lecture, slug='one, order=1).save()

        # Try to invert the order.
        t0 = Topic.objects.get(slug='zero')
        t1 = Topic.objects.get(slug='one')
        t0.order = 1
        t1.order = 0
        t0.save()
        t1.save()

Я пытаюсь сделать:

t0.order, t1.order = t1.order, t0.order

и затем сохранить, но любой измененный объект, который я сохраню первым, будет иметь то же значение 'порядка', что и другая запись.Я мог бы удалить и переделать, но когда придет время переупорядочить дюжину тем сразу, это будет боль.Какой самый чистый способ сделать это?

1 Ответ

0 голосов
/ 23 января 2012

Грязное грязное решение ... вы можете удалить и воссоздать ограничение на базу данных, используя южный API:

from south.db import db

db.delete_unique('app_lecture', ['lecture', 'order'])
# do your stuff

# then reenable the unique constraint... 
db.create_unique('app_lecture', ['lecture', 'order'])
...