0

私は小さな django プロジェクトを行っていますが、特定のモデルを管理サイトにインラインで配置しようとすると、いくつかの問題が発生します。例えば:

models.py

class Client(models.Model):
    client_name = models.CharField(max_length=100,unique=True,blank=False)
    phone_number = models.ForeignKey(Phone)

class Phone(models.Model):
    info = models.Charfield("eg. Personal", max_length=20)
    number = models.CharField(max_length=20, blank=False)

今、クライアント管理者に phone_number をインラインでスタックさせたい場合、それはできません...代わりに、次のようなモデルが必要です。

class Client(models.Model):
    client_name = ...

class PhoneAbstract(models.Model):
    info = ...
    number = ...

    class Meta: 
        abstract = True

class ClientPhone(PhoneAbstract):
    client = models.ForeignKey(Client)

...そして基本的に、電話をモデルに関連付けるたびに PhoneAbstract から継承する新しいクラスを定義します:(。これはひどいですが、これを実行して適切な管理インターフェイスを取得できる唯一の方法です:

admin.py

class PhoneInline(admin.TabularInline):
    model = ClientPhone

class ClientAdmin(admin.ModelAdmin):
    inlines = (PhoneInline, )

さて、これは(まだ教育を受けていない私の目には)地獄のように醜く、関係がぎこちなくなります...最初のケースでClientAdminに外部キーを入れる方法はありますか?おそらくこれが ModelAdmin.list_select_related の目的ですが、よくわかりません... :(

4

1 に答える 1

1

なぜこのように物事を定義したいのかわかりません。あなたが望むように、1 つの電話番号が複数のクライアントに属している可能性はありそうにありません。PhoneNumber モデルに ForeignKey フィールドを設定するのは正しいことです。これは、関係が理にかなっているためです (クライアントは複数の電話番号を持つことができます)。

しかし、抽象モデルやサブクラス化をいじる必要はありません。電話番号が複数の異なるモデル クラスを指す機能が必要な場合は、ジェネリック リレーションが必要です。

于 2012-11-16T13:26:14.663 に答える