django: как остановить сохранение (используя =) от создания нового первичного ключа - PullRequest
0 голосов
/ 25 мая 2011

В django я хочу скопировать данные из идентичных таблиц в одной БД в таблицы в другой - из «db01» в «default».Схемы идентичны.

>>> a=Household.objects.filter(h_identifier='H122000-48').using('db01')
>>> a[0].pk
>>> u'451465ea-0137-11e0-879a-70f1a16e0f80'
>>> a[0].save(using='default')
>>> b=Household.objects.filter(h_identifier='H122000-48').using('default')
>>> b[0].pk
>>> u'7c2484fe-8641-11e0-b080-00188b4d6b0e'

работает, но первичный ключ для записи, вставленной в «default», отличается от ключа, извлеченного из «db01».Чтобы сохранить целостность с другими таблицами, pk не должен меняться.Раздел django docs selection-a-database-for-save предполагает, что, поскольку экземпляр 'a' уже имеет первичный, тот же первичный ключ будет использоваться, когда новая запись будет вставлена ​​в значение по умолчанию.Я не могу заставить его сделать это.

Кто-нибудь знает, можно ли это сделать?заранее спасибо !!

(Это может показаться странной установкой, но приложение работает независимо на отключенных нетбуках в течение дня, а данные объединяются в master db ночью, когда все нетбуки состыкованы.Я могу сделать это нормально в MySQL, но хотел бы использовать django ORM, если это возможно.)

Ответы [ 2 ]

1 голос
/ 10 сентября 2011

Я знаю, что это недавно, но у меня была та же проблема сегодня - судя по ключу, который вы используете, ваше поле идентификатора имеет тип UUIDField из django_extensions?

Это немного глючит, так как сигнал pre_save всегда будет гарантировать, что ключ заменен независимо от того, существует ли он уже. Подклассы и замена функции pre_save исправляют это.

class FixedUUIDField(UUIDField):
def pre_save(self, model_instance, add):
    value = super(UUIDField, self).pre_save(model_instance, add)
    if self.auto and add and not value:
        value = unicode(self.create_uuid())
        setattr(model_instance, self.attname, value)
    return value
0 голосов
/ 25 мая 2011

В документах django предлагается использовать 'force_insert':

Второй вариант - использовать опцию force_insert для save (), чтобы Django выполнял SQL INSERT:

p = Person (name = 'Fred') p.save (using = 'first') p.save (using = 'second', force_insert = True) Это будетубедитесь, что у человека по имени Фред будет одинаковый первичный ключ в обеих базах данных.Если этот первичный ключ уже используется при попытке сохранения во второй базе данных, возникнет ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...