2017-01-08 3 views
1

자동 증가 기본 키 정수 (1 ~ 32767) 및 범위 B (32768 ~ 2147483647)의 범위 A가 제공됩니다. 조건이 true이면 기본 키가 RangeA에 할당 된 개체를 저장하고 RangeB에 저장합니다.기본 키 정수 범위 할당

admin (me)은 RangeA에 저장하는 유일한 사용자입니다. 위와 같이 할 수없는 경우 : Django가 항상 RangeB에 저장되어 있고 RangeA에 저장하기 위해 쉘을 사용해야하는 경우에는 이상적이지는 않지만 여전히 유용 할 것입니다.

Django와 Postgres를 사용하여 어떻게 수행 할 수 있습니까?

답변

1

가능한 한. 당신이 PostgreSQL을 연결하고 두 개의 서로 다른 시퀀스를 만들 필요가 다음 기본 키

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

으로 표준 AutoField를 사용하지 않도록 우선은 모델을 변경하는 것입니다.

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

대신 PSQL 콘솔에 그를 입력, 당신은 이러한를 만들 만들 장고 마이그레이션 (A 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) 

대안을 대체하는 INSERT 트리거 PostgreSQL의 BEFORE를 생성하는 것이다. nextval을 얻는 왕복 여행은 비용이 많이 들지는 않으나, 이것이 방아쇠를 만드는 데 관심이 있다면 선택할 수있는 옵션입니다. 이 경우 save 메소드를 사용하지 않아도되지만 트리거 내에서 동일한 로직을 구현해야합니다.