2012-08-31 3 views
0

이의 나는이 두 클래스가 있다고 가정 해 봅시다 다른 레코드를 작성하고 내가 만들고과 같이 작성되는 각 개 레코드에 칼라 기록을 첨부 할 방법 :장고 모델 - 저장 방법 오버라이드 (override)

class Collar(models.Model): 
    serial_number = models.IntegerField(primary_key=True, db_column='serial_number') 
    weight = models.CharField(max_length=10) 
    class Meta: 
     db_table = u'existing_table_from_before_django_was_born' 

class Dog(models.Model): 
    size = models.CharField(max_length=10) 
    collar = models.OneToOneField(Collar,blank=True, null=True, editable=False) 

    def save(self, *args, **kwargs): 
     if not self.id: 
      self.collar = Collar() 
     if self.collar: 
      self.collar.weight = '10' 
      self.collar.save() 
     super(Dog,self).save(*args, **kwargs) 

이 코드를 실행하면 새 Collar 레코드가 생성되지만 문제는 Dog.collar_id가 테이블에 null로 표시된다는 것입니다.

여기서 주목할 점은 Collar 클래스가 기존 테이블을 참조한다는 것입니다. 나는 기본 키를 MySQL에서 자동으로 증가 시키도록 만들었지 만, 아마도 거기에 뭔가 잘못 될 수 있습니다.

저장 방법을 단계별로 수행하면 Collar 개체가 만들어지고 값은 업데이트되지만 self.collar.serial_number는 'none'으로 인쇄됩니다.

어떤 아이디어가있을 수 있습니까? 나는 영원히 감사 할 것입니다. (1.2.5에 있음)

답변

2

당신은 당신의 Collar.serial_number 필드 AutoField해야한다.

+0

그 트릭을 했어! 장고 문서를 어디서나이 정보로 업데이트 할 가치가 있는지 궁금합니다. – Greg

1

Collar은 저장하기 전까지에 PK가 있습니다. 즉, 할당 시점까지는 할당이 작동하지 않습니다. 장고는 저장에 자동으로 값을 가져옵니다 알 수 있도록

collar = Collar() 
... 
collar.save() 
self.collar = collar 
+0

여전히 작동하지 않는 것 같습니다. 그러나 나는 그것이 내가했던 일이라고 생각합니다. 제가 생략 한 (아마도 중요한) 세부 사항으로 제 질문을 업데이트 할 것입니다. – Greg

+0

그건 "세부 사항"이 아니에요, 그건 완전히 다른 질문입니다. –

관련 문제