2017-01-08 41 views
1

給定自動遞增主鍵整數(1至32767)和RangeB(32768至2147483647)的RangeA。如果條件爲真,則保存具有在RangeA中分配的主鍵的對象,否則將其保存在RangeB中。分配主鍵整數的範圍

管理員(我)將是保存到RangeA的唯一用戶。如果上述不可行:如果Django總是保存在RangeB中並且它需要進入shell以保存在RangeA中,它將不是理想的,但仍然可用。

這怎麼能用Django和Postgres完成?

回答

1

很可能。首先是要改變你的模型,以便它不使用標準的下拉列表AutoField作爲主鍵

class MyModel(models.Model): 
    id = models.IntegerField(primary_key=True) 

然後,你需要連接到PostgreSQL並創建兩個不同的序列。

CREATE SEQUENCE small START 1; 
CREATE SEQUENCE big START 32768; 

代替打字說成PSQL控制檯,您也可以考慮編輯Django的遷移(使用RunSQL指令)來創建創建這些。

下一步是重寫保存方法

def save(self,*args, **kwargs) 
    if not self.id : 
     cursor = connection.cursor() 
     if small condition: 
      cursor.execute("select nextval('small')") 
     else: 
      cursor.execute("select nextval('big')") 

     self.id = cursor.fetchone()[0] 

    super(MyModel,self).save(*args,**kwargs) 

替代重寫保存方法是創建一個PostgreSQL BEFORE INSERT觸發。去往nextval的往返不是很昂貴,但如果這是一個問題,創建觸發器是可以選擇的選項。在這種情況下,您不需要使用save方法,但是您必須在觸發器內部實現相同的邏輯。