4

データベース内のテーブルに接続された 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'

私を助けてくれたみんなに感謝します。

4

1 に答える 1

1

これは少し奇妙に思えます。ただし、私が理解している限り、マルチテーブル継承を使用する場合、Djangoは親と子の間に必要な1対1のマッピングを自動的に設定します。これらも手動で設定しているので、これが原因で何らかの不整合が発生している可能性があります。

データベースを直接見てみると、2つの異なる1対1の関係は一貫していますか?

モデルから明示的な1対1のフィールドを削除するとどうなりますか?

于 2012-12-19T11:07:48.343 に答える