データベース内のテーブルに接続された 3 つの継承されたクラス (Fitters -> Workers -> Staffs) があります (クラス名は複数形ですが、今は重要ではありません)。
ユーザーはフィッターのみを追加/編集/削除できます。Workers テーブルと Staffs テーブルは自動的に更新されます (カスケード)。
新しいフィッターを追加すると、すべての変更がデータベース内のすべてのテーブルに適用されます。しかし、Django 管理ツールを使用して Fitter を編集したい場合、Fitter の編集ページに移動すると、誤って入力されたフィールドが表示されます。
例えば:
- Staffs テーブルには、id=41 の「John Smith」があります。
- Workers テーブルには、id=21 および ForeignKey=41 のレコードがあります (John Smith に対して)
- Fitters テーブルには、id=5 および ForeignKey=21 のレコードがあります (Workers テーブルに記録するため)。
Fitter の「John Smith」ページを編集すると、すべてのフィールドが「Kevin Thomas」で埋められていることがわかります (スタッフ テーブルの id=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)
...
解決:
解決策は、モデルごとに独自の 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'
私を助けてくれたみんなに感謝します。