2

ファイルmyapp/models.pyにはこのサンプルコードがあります..

from django.db import models

# model for 'user' table in database oracle_dbuser1:user 
class User(models.Model):
    . . .
    customerid = models.BigIntegerField()

# model for 'customer' table in database oracle_dbuser2:customer
# Note that there is no Foreign key integrity among these legacy tables.
class Customer(models.Model):
    . . .
    customerid = models.BigIntegerField()

ファイルmyapp/admin.pyには次のコードがあります。

from maasusers.models import User, Customer
from django.contrib import admin

class UserAdmin(admin.ModelAdmin):
    # A handy constant for the name of the alternate database.
    db_one = 'dbuser1'
    db_two = 'dbuser2'

    # display in a list
    list_display = (. . .) # question 1

    def queryset(self, request):
        result = super(UserAdmin, self).queryset(request).using(self.db_one) # question 2
        return result

# Register the Poll class
admin.site.register(User, UserAdmin)
admin.site.register(Customer, UserAdmin)

質問 1: 上記参照: 両方のテーブルの列を表示したい。どうすればこれを達成できますか?例えば。Select usr.col1, usr.col2, cust.col1, cust.col10 from user usr, customer cust where usr.col2 = cust.col3;

queryset()質問 2:関数を使用して対応する関数を記述する方法はusing?

4

1 に答える 1

3

データベース ルーターを使用すると、クエリセットで使用する必要がなくなりますusing()。どのモデルにどのデータベースを使用するかをdjangoに通知します。面倒な作業になる可能性があるため、ルーターに関するドキュメントをよく読むことをお勧めします (私たちは仕事でルーターを使用しています)。

ただし、次の点に注意してください。

myapp 内のモデルのいずれかに、他のデータベース外のモデルへの関係が含まれている場合、この例は機能しません。クロスデータベース リレーションシップは、Django が現在処理できない参照整合性の問題を引き起こします。

Django は、キーを使用して結合するかどうかに関係なく、クロス データベース結合を処理しません。両方のモデルからのデータが必要な場合は、2 つの個別のクエリを実行し、コードで結合を行うことができます。ただし、これが管理者にどのように適用されるかはわかりません。

別の方法として、ビューを作成して、データベース自体のクロス データベース テーブルを結合することもできます。ただし、インスタンスを保存することはできません。

これが調査の良い出発点になることを願っています。

于 2012-04-22T11:11:57.347 に答える