次の2つのテーブルを使用して、外部データベースのデータを読み取る必要があります(テーブル構造を変更できません)。
表1
表2
これらの2つのテーブルを次のような単一のDjangoモデルに結合することは可能ですか?
モデル:
追加情報:
Table2のエントリのキーは、Table1のエントリのサブセットです。したがって、Table2のエントリには、Table1に一致するエントリがありますが、その逆はありません。
これまでの作業:
テーブル(1と2)ごとに1つのモデルがあり、Table1モデルにはTable2モデルの対応する情報を検索する「field2」@propertyがあります。
また、次のクエリを使用してSQLレベルでこれを行うことができます。
SELECT
table1.key,
table1.field1,
table2.field2,
FROM
table1
LEFT OUTER JOIN table2
ON table1.key=table2.key
ORDER BY table1.key ASC
===いくつかの回答を見た後、ソリューション実装の詳細が更新されます。
私は2つのモデルになりました:
class Model1(models.Model):
key = models.CharField(max_length=100, primary_key=True)
field1 = models.TextField()
class Meta:
managed = False
db_table = 'Table1'
def field2_value(self):
try:
return self.field2.value
except Model2.DoesNotExist:
return None
class Model2(models.Model):
key = models.OneToOneField(Model1, primary_key=True, db_column='key',
related_name='field2')
field2 = models.TextField()
class Meta:
managed = False
db_table = 'Table2'
この質問をしたときに最初に考えていたものとは異なりますが、希望するユースケースを満たしています。
また、対応する管理クラスは次のとおりです。
class Model2Admin(admin.StackedInline):
model = Model2
@admin.register(Model1)
class Model1Admin(admin.ModelAdmin):
inlines = (Model2Admin,)
list_display = ('key', 'field1', 'field2_value')
# Loads the related property in one SQL call instead of one call per entry
list_select_related = ('field2',)
素晴らしい回答をありがとうKaaNSARIKAYA。2つのテーブルのビューを作成できることを知りませんでした。データベース構造を変更できる場合は、オプションを選択します。
より良い解決策は、これらを2つのモデルとして保持することですが、2番目の主キーを最初のモデルのOneToOneFieldにします。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加