簡體   English   中英

分配主鍵整數范圍

[英]Allocate ranges of primary key integers

給定自動遞增主鍵整數的 RangeA(1 到 32767)和 RangeB(32768 到 2147483647)。 如果條件為真,則將主鍵保存在 RangeA 中的對象,否則將其保存在 RangeB 中。

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

如何使用 Django 和 Postgres 做到這一點?

很有可能。 第一件事是更改您的模型,使其不使用標准 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)

覆蓋 save 方法的替代方法是創建一個 postgresql BEFORE INSERT 觸發器。 獲得 nextval 的往返費用不是很高,但如果這是一個問題,創建觸發器是選擇的選項。 在這種情況下,您不需要覆蓋 save 方法,但您必須在觸發器內實現相同的邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM