1

次のようなモデルがありますが、これは大きくなりすぎており、別のアクティブなテーブルに分割する必要があります。1 日の終わりには、1 つのテーブルにはすべてのオブジェクトが含まれ、もう 1 つのテーブルにはアクティブなオブジェクトのみが含まれます。

   class Tickets(models.Model):
        price = ....
        number = .....
        date = ....
        active = ....
        parent = models.ForeignKey('self', related_name='children')

        ManyMoreFields

複雑さの原因は 2 つあります。

1) ActiveTickets テーブルの親フィールドは Tickets テーブルを指します。related_name は変更しないでください。

2) ActiveTickets テーブルと Tickets テーブルの両方に、それらを継承するプロキシ モデルがあります。

     class CityTickets(Tickets):

          class Meta:
             proxy = True


     class ActiveCityTickets(ActiveTickets):
          class Meta:
             proxy = True

明らかに、Ticket のすべてのフィールド (多数あります) をコピーして貼り付けることができますが、それは正しい方法ではありません。Abstract 継承と Mixin を使用しようとしました (Ticket と ActiveTickets の両方に継承される別のクラスでフィールドを定義します)。

抽象継承の問題の 1 つは、ForeignKey フィールドである親が重複していて、 related_name が同じであるため、問題を引き起こしていることです。一般に、私の試みは、単体テストと機能テストが失敗する原因となっています。

ここでいくつかのエレガントなアプローチは何ですか? 2 つの別個の MySQL テーブルを作成し、単一のモデルを複数のマネージャー (および db ルーター) で使用することを検討する必要がありますか? それは合理的ですか?

4

1 に答える 1

2

たぶんこれが役立ちます:

class Base(models.Model):
    m2m = models.ManyToManyField(OtherModel, related_name="%(app_label)s_%(class)s_related")

    class Meta:
        abstract = True

https://docs.djangoproject.com/en/dev/topics/db/models/#be-careful-with-related-name

于 2012-04-04T16:34:18.447 に答える