2012-12-19 2 views
4

내 데이터베이스의 테이블과 연결된 3 개의 상속 된 클래스 (Fitters -> Workers -> Staffs)가 있습니다 (클래스 이름은 복수형이지만 현재 중요하지는 않습니다).Django admin - 편집 페이지의 잘못된 모델 개체

사용자는 Fitters 만 추가/수정/제거 할 수 있습니다. 근로자 및 직원 테이블은 자동으로 (계단식으로) 업데이트됩니다.

새로운 Fitter를 추가하면 모든 변경 사항이 데이터베이스의 모든 테이블에 적용됩니다. 하지만 Django 관리 도구를 통해 모든 수정자를 편집하려면 수정 자 페이지로 이동하고 입력란이 잘못 표시됩니다. 예를 들어

: 스태프 테이블에서

  • 내가 "존 스미스"가 ID = 근로자 표 41
  • I가 = 21, 외래 키 = 41 (존 스미스) ID를 가진 레코드가
  • 와 나는 배관공 "존 스미스"페이지를 편집 할 갈 때 설치자 테이블에서
  • 나는 = 5와 외래 키 = 21

(노동자 테이블의 레코드) id를 가진 기록을 가지고, 나는 케빈 "에 의해 작성 모든 필드를 참조 토마스 "(직원 = 테이블에서 id = 21!). 그래서 장고는 Workers 테이블을 놓치고 Staffs 테이블로 바로갑니다.

어떻게 해결할 수 있습니까?

class Staffs(models.Model): 
    id = models.AutoField(primary_key=True) 

    name = models.CharField(max_length=135, blank=True) 
    surname = models.CharField(max_length=135, blank=True) 

    def __unicode__(self): 
     return self.name + " " + self.surname 

    class Meta: 
     db_table = u'staffs' 

class Workers(Staffs): 
    idWorker = models.AutoField(primary_key=True, db_column='id') 

    staffs_idstaff = models.OneToOneField('Staffs', db_column='Staffs_idstaff', parent_link=True) 
    brigades_idbrigade = models.ForeignKey('Brigades', db_column='Brigades_idBrigade') 

    def __unicode__(self): 
     return self.staffs_idstaff.name + " " + self.staffs_idstaff.surname 

    class Meta: 
     db_table = u'workers' 

class Fitters(Workers): 
    idFitter = models.AutoField(primary_key=True, db_column='id') 

    qualification = models.CharField(max_length=135, blank=True) 
    workers_idworker = models.OneToOneField('Workers', db_column='Workers_idWorker', parent_link=True) 

    def __unicode__(self): 
     staff = self.workers_idworker.staffs_idstaff 
     return staff.name + " " + staff.surname 

    class Meta: 
     db_table = u'fitters' 

EDIT1 :

나는 다음과 같은 코드를 변경 시도 : 그것은 지금 아주 간단

class Staffs(models.Model): 
    id = models.AutoField(primary_key=True) 
    name = models.CharField(max_length=135, blank=True) 
    surname = models.CharField(max_length=135, blank=True) 

    class Meta: 
     db_table = u'staffs' 

class Workers(Staffs): 
    idWorker = models.AutoField(primary_key=True) 
    brigades_idbrigade = models.ForeignKey('Brigades') 

    class Meta: 
     db_table = u'workers' 

class Fitters(Workers): 
    idFitter = models.AutoField(primary_key=True) 
    qualification = models.CharField(max_length=135, blank=True) 

    class Meta: 
     db_table = u'fitters' 

여기 내 초안 코드입니다. 내 데이터베이스를 동기화했지만 절대적으로 같은 문제가 있습니다!

EDIT2 : 내 admin.py 파일의

부 :

from django.contrib import admin 
from appclient.models import * 

admin.site.register(Fitters) 
admin.site.register(Staffs) 
admin.site.register(Workers) 
... 

해결책 :

솔루션은 내가 각각에 대해 내 자신의 ID 년대와 외래 키의를 사용할 필요가 없습니다 것입니다 모델. Djando는 각 모델에 대한 특수 필드를 자동으로 만들고이를 id (PrimaryKey) 및 상위 테이블 (ForeignKey)에 대한 링크로 사용합니다. 나에게 도움이 모든 사람에게

class Staffs(models.Model): 
    name = models.CharField(max_length=135, blank=True) 
    surname = models.CharField(max_length=135, blank=True) 

    class Meta: 
     db_table = u'staffs' 

class Workers(Staffs): 
    brigades_idbrigade = models.ForeignKey('Brigades') 

    class Meta: 
     db_table = u'workers' 

class Fitters(Workers): 
    qualification = models.CharField(max_length=135, blank=True) 

    class Meta: 
     db_table = u'fitters' 

감사 : 여기

는 솔루션입니다.

+1

왜 OnetoOneFields를 사용합니까? 모델 상속을 이해하는 데 문제가 있거나 기존 데이터베이스 테이블에 장고 모델을 적용해야합니까? –

+0

@ChristianThieme 예, 기존 데이터베이스가 있으므로 데이터베이스 관리를 위해 간단하게 사용자 응용 프로그램을 만들어야합니다. –

+0

admin.py 파일도 함께 보여 주실 수 있습니까? –

답변

1

다소 이상하게 보입니다. 그러나 내가 이해하는 한, Django는 multi-table inheritance을 사용할 때 부모와 자식 사이에 필요한 일대일 매핑을 자동으로 설정합니다. 또한 이것을 수동으로 설정 했으므로 어떤 이유로 인해 불일치가 발생했을 수 있습니다.

데이터베이스에서 직접 살펴보면 서로 다른 일대일 관계가 일치합니까?

모델에서 명시적인 일대일 필드를 제거하면 어떻게됩니까?

+0

예, 데이터베이스에는 이러한 일대일 관계가 있습니다. Fitters 클래스에서 일대일 필드를 제거하면 1054, " '필드 목록'에 알 수없는 'fitters.workers_ptr_id'"오류가 있습니다. Workers 클래스에서 일대일 필드를 제거하면 1054, " '필드 목록'의"workers.staffs_ptr_id 알 수없는 열 ""오류가 있습니다. –

+0

모델 정의에서 일대일 필드를 제거 할 때 db를 다시 동기화해야 할 수도 있지만 코드에서이 필드를 사용할 수는 없습니다. – nilu

관련 문제