2012-01-21 4 views
8

새로운 Django 모델을 배치하는 방법을 알아 내려고합니다. 새 모델이 데이터베이스에 저장 될 때 기본 키가 증가하도록합니다. 동일한 외래 키를 가진 모든 레코드의 다음으로 높은 값.Django 모델 자동 증가 기본 키 외래 키 기반

마치 this question asked과 비슷하지만 장고에서 어떻게 할 것인지 궁금합니다. 여기에 비슷한 상황을 보여줍니다 질문에서 발췌입니다 :

id | job_id | title 
0  1  hi 
1  1  hello 
2  1  goodbye 
0  2  hi 
1  2  hello 

나는 you can't have multiple primary keys in a Django model을 알고 당신은 unique_together를 사용할 수 있지만 문서는 CREATE 문에 해당하는 UNIQUE 문을 사용했다. 모델에서

class ModelA(models.Model): 
    key = models.PositiveIntegerField(primary_key = True) 
    fk = models.ForeignKey(ModelB) 

    def Meta(self): 
     unique_together = ("key", "fk") 

내가 무엇을 찾고 있어요 달성하기 위해 this answer 작업시겠습니까? 모델 간의 관계는 ModelB이 많은 ModelA이지만 각 ModelB은 하나만 ModelA입니다.

+1

첫 번째 단락은 구문 분석하지 않았습니다. –

+0

@ IgnacioVazquez-Abrams, 첫 번째 단락을 다시 말하고 예제를 추가했습니다. 지금은 더 이해가 되니? – Dirk

답변

8

더크 덕분에 모델 번호를 약간 변경해야합니다 (허용되는 경우) Ignacio가 말했습니다. 그래서 ModelA은 다음과 같이 보일 것입니다.

class ModelA(models.Model): 
    key = models.PositiveIntegerField() 
    fk = models.ForeignKey(ModelB) 

    def Meta(self): 
     unique_together = ("key", "fk") 

    def save(self, *args, **kwargs): 
     key = cal_key(self.fk) 
     self.key = key 
     super(ModelA, self).save(*args, **kwargs) 

같이, 당신은 내가 fk as argument을 복용하는 방법 cal_key에서 키 값을 계산하는 overridden the default save method을 볼 수 있습니다. 따라서 아래의 cal_key 메소드를 모델 파일에 정의하십시오.

def cal_key(fk): 
    present_keys = ModelA.objects.filter(fk=fk).order_by('-key').values_list('key',flat=True) 
    if present_keys: 
     return present_keys[0]+1 
    else: 
     return 0 

cal_key 방법

명확하게 당신이 실제로 무엇을 필요로 나타냅니다.

+0

감사합니다. Sandip. Ignacio의 대답보다 이식성이 좋기 때문에 나는 당신의 답을 찾아갔습니다. – Dirk

+0

응용 프로그램이 멀티 스레드 인 경우 동일한 키를 두 개의 다른 기능에 할당하려고 시도하기 때문에이 솔루션이 unique_together 유효성 검사 오류를 발생시킬 수 있습니까? –

0

이 시도 할 수 있습니다 :

AutoFile 

당신은 자세한 내용 here을 찾을 수 있습니다.