2009-10-31 3 views
0

에 ID를 미리 채우는 방법 :나는 간단한 질문 모델이 장고

class Question(Polymorph): 
    text = models.CharField(max_length=256) 
    poll = models.ForeignKey(Poll) 
    index = models.IntegerField() 

을 그리고 (저장시) 내가 미리 채울하는 ID 값 인덱스 필드를 싶습니다. 물론 저장하기 전에 ID 값 (이후에 생성 된 ID 값)이 없으므로 가장 간단한 방법은 무엇일까요? 어떤 아이디어?

나는 django-signal에 대해 생각하지만 save() 메서드를 두 번 호출해야 할 것이다.

답변

5

하지만 그렇게하면 저장을 두 번 호출해야합니다. ID는 새 행이 INSERT 될 때 데이터베이스 서버에 의해 직접 생성됩니다 (sqlite 제외). 따라서 어떤 경우에도이를 수행해야합니다.

실제로 ID 값이 index 필드에 있어야하는지 묻습니다. 언제나 obj.id으로 사용할 수 있습니다. 따라서 더 긴 값의 일부로 원한다고해도 속성을 통해 항상 동적으로 계산할 수 있습니다.

+0

답변 해 주셔서 감사합니다. –

0

예, 어딘가에서 다음 ID를 찾아내는 것은 가능하지 않습니다. 나는 당신이 완전히 당신이로 얻는 문자열에서 개체의 ID를 도출 할 수없는 경우에이 길을 가야 할 것 같아요

def save(self, *args, **kwargs): 
    """Save method for Question model""" 
    if not self.id: 
     super(Question, self).save(*args, **kwargs) 
    # Fill the index field 
    self.index = self.id # plus whatever else you need 
    return super(Question, self).save(*args, **kwargs) 

: 심지어 신호를 사용하는 것보다 간단하게 당신의 저장 방법이 뭔가를두고있다 필터에의 입력 하지만 문자열이 "something- {id} -something-else"인 경우 인덱스 필드를 없애고 정규식을 사용하여 문자열에서 id 값을 추출한 다음 Questions.objects를 사용하여 ID로 직접 필터링하는 것이 좋습니다. filter (id = id)

0

이중 커밋을 우회하는 한 가지 방법은 자동 증가 기본 키 이외의 것을 사용하는 것입니다. Django는 프라이 머리 키가 하나이고, 하나 뿐인만큼 오랫동안 기본 키가 무엇인지 상관하지 않으며, 문자열이나 정수 중 하나입니다. 모델을 초기화 할 때 즉시 모델에서 생성 할 수있는 guid와 같은 것을 사용할 수도 있고, 데이터베이스가 무엇인지 신경 쓰지 않아도 데이터베이스를 설정할 수 있습니다 (데이터베이스가 guids를 지원한다고 가정 할 때).).

관련 문제