状況
は、我々は、機能の異なる種類のチケット支援システムからチケットを使用して、いくつかの異なるアプリケーションを持っています。
まず、チケットサポートシステムKayakoのモデルを表すいくつかのモデルを持つアプリケーションがあります。このアプリケーションは、それを利用する他のアプリケーションについては何も知ってはならず、可能な限り一般的なままにすべきです。このアプリケーションはKayakoの既存のテーブルを使用しているので、同じデータベース上で実行しています。このアプリケーションをkayakodb
としましょう。
1つのアプリケーションで、顧客データベースからチケットサポートシステムのチケットにリンクしています。これまでは、このシステムでは、チケットサポートシステム内でチケットを独自に表現し、kayakodb
によって提供されるAPIを使用してチケットを照会しました。その後、顧客とドメインをリンクするチケットのこの表現を使用しました。しかしこれはあまりにも複雑であまり論理的ではありませんでした。そのため、プロキシモデルに切り替えて、顧客とドメインへのリンクを表すモデルをkayakodb
に移動させました。このアプリケーションをsidebar
としましょう。
別の新しいアプリケーションでは、チケットサポートシステムからのチケットを通話とともに明確にまとめて表示しているため、サポート部門ではどの通話とチケットがどの顧客に関連しているかを簡単に確認できます。このシステムは、sidebar
モデルによって提供される機能のいくつかが、新しいプロキシモデルが宣言する他のものとともにこのアプリケーションにも必要とされるので、プロキシモデルsidebar
に対するプロキシモデルを有する。このプロジェクトをWOW
と呼ぶことにしましょう。
sidebar
とWOW
アプリケーションは、両方とも同じプロジェクト/リポジトリの一部です。このデータベースは、独自のデータベースを持つConeybeach
と呼ばれます。しかし、kayakodb
は全く関係のないプロジェクトです。それはpip
経由でインストールする要件ファイルを介してConeybeach
に含まれています。
問題
Djangoはもちろん、あるインストール
kayakodb
、ノー行くためのプロキシモデルの移行を作成し、新しいセットアップのためのマイグレーションを作成します。
kayakodb
の新しいバージョンをインストールするときはいつでも、この移行を上書きします。
kayakodb
は、どのモデルがそれを利用しているかを知るべきではありません。
コード
kayakodb
内部
Ticket
モデル:
class Ticket(models.Model):
"""
This model is a representation of the data stored in the "kayako" database table "swtickets". Minus a lot of stuff
we don't use. If you add a field make sure it has the same name as the field in kayako.swtickets.
"""
# Fields, functions and manager etc.
class Meta:
db_table = 'swtickets'
managed = False
sidebar
内部SidebarTicket
プロキシモデル:
from kayakodb.models import Ticket
class SidebarTicket(Ticket):
class Meta:
# Since this class is a wrapper we don't want to create a table for it. We only want to access the original
# model as we always do, but provide a different interface (when it comes to functions). Proxy models allow us
# to do this: https://docs.djangoproject.com/en/1.10/topics/db/models/#proxy-models
proxy = True
# Don't look for this model in the sidebar tables, but in the kayakodb tables.
app_label = 'kayakodb'
# Some extra functions
(からContact
クラスTicketWrapper
継承Hynekcによって要求されるようエル)。(私は承知しているなどの問題が限り、このモデルではありませんが)このモデルは、ベースTicketWrapper
のためのモデルとのコールを表す別のモデルとして使用されます。
class Contact(models.Model):
type = None
class Meta:
abstract = True
def __getattr__(self, attr):
if attr in ['customers', 'add_customer_id', 'remove_all_customers', 'byters', 'domainnames', 'add_domain_name',
'remove_domain_name', 'add_text', 'remove_text', 'texts', 'creation_date', 'add_tag', 'get_tags',
'remove_tag', 'identifier']:
raise NotImplementedError('You should implement {}'.format(attr))
raise AttributeError(attr)
TicketWrapper
プロキシモデルWOW
内側:
from sidebar.models import SidebarTicket
class TicketWrapper(Contact, SidebarTicket):
class Meta:
# Since this class is a wrapper we don't want to create a table for it. We only want to access the original
# model as we always do, but provide a different interface (when it comes to functions). Proxy models allow us
# to do this: https://docs.djangoproject.com/en/1.10/topics/db/models/#proxy-models
proxy = True
# Don't look for this model in the WOW database, but in the kayakodb database.
app_label = 'kayakodb'
# Some extra functions
私は目を指定しない試した
- を試してみましたが、何
両方のプロキシモデルの場合は
app_label
です。これにより適切な移行が行われますが、プロキシモデルはConeybeachデータベースのkayakodb.Ticket
モデルを検索します。 - 私はサブクラスのために
abstract = True
を指定しようとしましたが、まだモデルのマネージャを利用できるようにしたいと思っていたので、これは確かではありませんでした。 - 現在作成されている移行を実際の
kayakodb
プロジェクトに移行することを検討しましたが、これは良い解決策ではないと私は考えています。kayakodb
は、モデルの実装や使用されている場所については何も知らないようにしてください。 ./manage.py check
は0の問題を返します。
質問
は、どのように私は別のデータベースまたはプロジェクトに位置したモデルのためのプロキシモデルを作成することができますか?
編集
管理対象外であることを
kayakodb.Ticket
モデルを設定した後
WOW
プロジェクトが
kayakodb
に
すべてモデルのマイグレーションを作成しようとします。結果:
Migrations for 'sidebar':
0004_auto_20170116_1210.py:
- Delete model Ticket
Migrations for 'kayakodb':
0001_initial.py:
- Create model Staff
- Create model Tag
- Create model Ticket
- Create model TicketPost
- Create model TicketTag
- Create model TicketCustomer
- Create model TicketDomain
- Create proxy model SidebarTicket
- Alter unique_together for ticketdomain (1 constraint(s))
- Alter unique_together for ticketcustomer (1 constraint(s))
- Create proxy model TicketWrapper
@ e4c5はい、私はそれを知っています。それはうまくいっていますが、それが上書きされたときの結果です。 – Bono
プロキシモデルが将来の移行で別のモデルによって参照される可能性があるため、あなた自身がそう言っています。後でそれを放棄することができれば、なぜそれは別の方法で移行を作成するのですか? – Bono
あなたはそこにいます!近くの投票を取り消す – e4c5