django:如何在创建新主键时停止保存(使用=)

时间:2011-05-24 20:55:04

标签: django django-models save primary-key multiple-databases

在django中,我想将一个数据库中相同表中的数据复制到另一个数据库中的数据 - 从“db01”复制到“默认”。架构是相同的。

>>> 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部分selecting-a-database-for-save表明,由于实例'a'已经有一个主要内容,因此当将新记录插入'default'时,将使用相同的主键。我无法做到这一点。

有谁知道这是否可以做到?提前谢谢!!

(这可能看起来像一个奇怪的设置,但应用程序在白天在断开连接的上网本上独立运行,并且数据在所有上网本停靠的夜晚合并到主数据库中。我可以在mysql中做得很好但是如果可能的话,我想使用django ORM。)

2 个答案:

答案 0 :(得分:1)

我知道这是从不久前开始的,但今天我遇到了同样的问题 - 根据您使用的密钥判断,您的id字段是来自django_extensions的UUIDField类型吗?

它有点小问题,因为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

答案 1 :(得分:0)

django docs建议使用'force_insert':

  

第二种选择是使用   force_insert选项将save()保存到   确保Django执行SQL INSERT:

     
    
      
        

p = Person(name ='Fred')         p.save(使用= '第一')         p.save(using ='second',force_insert = True)这将确保         那个名叫弗雷德的人会有         两者都是相同的主键         数据库。如果那个主键是         您尝试保存时已经在使用         到第二个数据库,一个错误         将被提出。