2012-12-19 41 views
4

我有3個繼承類(Fitters - > Workers - > Staffs)與我的數據庫中的表(類名複數,但現在不重要)連接。Django管理員 - 錯誤的模型對象在編輯頁

用戶只能添加/編輯/刪除鉗工。工作人員表自動更新(級聯)。

它工作正常:當我添加新的Fitter時,所有更改都會發送到數據庫中的所有表。但是,當我想通過Django管理工具編輯任何Fitter時,我要編輯Fitter頁面,並且看到填充不正確的字段。

例如:

  • 在職員表我有 「約翰·史密斯」 使用id = 41
  • 在工人表我有ID的記錄= 21和ForeignKey的= 41(約翰史密斯)
  • 在鉗工工作臺我有ID的記錄= 5和ForeignKey的= 21(在工表記錄)

當我去編輯鉗工「約翰·史密斯」頁面上,我看到「凱文填寫所有領域托馬斯「(編號= 21在職員表!)。 因此,Django錯過了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) 
... 

SOLUTION:

解決辦法是,我不需要用我自己的ID和ForeignKey的對每個模型。 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?你有理解模型繼承的問題,還是你需要在現有的數據庫表上安裝django模型? –

+0

@ChristianThieme是的,我有現有的數據庫,我需要爲數據庫管理創建簡單的用戶應用程序。 –

+0

你能告訴我們你的admin.py文件嗎? –

回答

1

這似乎有點奇怪。然而,據我所知,當使用multi-table inheritance時,Django會自動設置父母和子女之間所需的一對一映射。正如你也手動設置這些,很可能是由於這個原因導致了某種不一致。

如果你直接看數據庫,兩種不同的一對一關係是否一致?

如果從模型中刪除顯式的一對一字段,會發生什麼情況?

+0

是的,數據庫包含這些一對一的關係。如果我刪除Fitters類中的一對一字段,則會出現錯誤:1054,「字段列表」中的「未知列」fitters.workers_ptr_id「。如果我刪除Workers類中的一對一字段,則會出現錯誤:1054,「字段列表」中的未知列'workers.staffs_ptr_id'。 –

+0

刪除一對一字段(在模型定義中)時,可能需要重新同步數據庫,當然,您不能在代碼中使用這些字段。 – nilu