1

私は現在、既存のカレンダーアプリケーションにDjangoインターフェースを実装するプロジェクトに取り組んでいます。カレンダーアプリケーションには、バックエンドDBとしてMySQLがあります。

カスタムアプリケーションでは、既存のカレンダーアプリケーションで使用されているテーブルの1つでデータを変更/拡張したいと思います。

# Auto-generated by inspectdb - table used by calendar application
class CalendarEvent(models.Model:)
    name       = models.CharField(max_length=80)
    start_time = models.DateTimeField()
    end_time   = models.DateTimeField()


# Manually created table
class CustomCalendarEvent(models.Model:)
    code       = models.CharField(max_length=80) # Mapped from name
    length     = models.DateTimeField()          # start_time - stop_time
    .... additional data ....

また、データの表現を既存のカレンダーテーブルと同期させたままにします。つまり、カレンダーアプリケーションで新しいエントリが作成されると、これらは自動的にカスタムテーブルに伝播されます。

これを行うためのいくつかの明白な方法(たとえば、cronまたはMySQLトリガーによって開始される同期スクリプト)を考えることができますが、これらのソリューションが特に洗練されているとは感じません。

1つの可能性は、CustomCalendarEventにカスタムマネージャーを使用し、 get_query_set関数をオーバーライドして、同期関数もトリガーすることです。

これはDjangoCustomManagersの合法的な使用ですか?そうでない場合、誰かがこの問題の代替アプローチを推奨できますか?

4

2 に答える 2

2

モデルの継承を使用しないのはなぜですか? CustomCalendarEventその方法で新しいフィールドを継承しCalendarEventて追加できます。

于 2009-12-10T09:13:58.500 に答える
2

より多くのフィールドで CalendarEvent を拡張しようとしているようです。

まず、CustomCalendarEvent に次の変更を加えます。

code = models.CharField(max_length=80) # Mapped from name

calendar_event = models.ForeignKey(CalendarEvent)

length が start_time と end_time の間の日数の差を計算するだけの場合は、 CustomCalendarEvent から削除して、代わりに CalendarEvent で呼び出し可能にします (計算を行うメソッドにすぎません)。

2 つのテーブル間でデータを複製したくはありません。これはname、CalendarEvent とcodeCustomCalendarEvent で得られるものです。名前の更新は同期するcode必要があり、CalendarEvent テーブルをより多くのフィールドで拡張するだけであれば、その理由はありません。

次に、CalendarEvent のメソッドメソッドをオーバーライドしてsave()delete()、挿入/削除の変更を伝達できます。CustomCalendarEvent は CalendarEvent の単なる拡張であるため、更新はあなたの場合は問題ではないと思います。

別の方法: CalendarEvent でデータベース挿入トリガーを使用して、エントリを CustomCalendarEvent に伝達します。データを複製する代わりに、CustomCalendarEvent テーブルに CalendarEvent への外部キーを持たせます。


編集:ちなみに、読み取り操作の副作用であっても、カスタムマネージャーを使用してデータを変更することはありません。マネージャーは、データの変更ではなく、クエリに関するものです。

于 2009-12-09T22:00:42.697 に答える