2012-04-22 41 views
2

文件myapp/models.py有此示例代碼..如何在Django的2個數據庫(沒有外鍵)上應用查詢?

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;

問題2:如何使用using函數編寫相應的queryset()函數?

回答

2

Database Routers可以幫助您避免在查詢集上使用using()。你通知django哪些數據庫用於哪些模型。我建議你仔細閱讀圍繞路由器的文檔,因爲它們可能是一種痛苦(我們在工作中使用它們)。

注意以下一些:如果任何在MYAPP的車型包含其他數據庫以外的型號關係

這個例子將無法正常工作。跨數據庫關係引入了Django當前無法處理的參照完整性問題。

Django不處理跨數據庫連接,無論您是否想要使用鍵來連接。如果你需要這兩種模型的數據,你可以執行兩個單獨的查詢,並自己在代碼中進行連接。我不知道這將如何適用於管理員。

另一種方法是創建一個視圖,數據庫本身內加入跨數據庫表。但是,您將無法將實例保存回去。

希望這是您調查的好起點。

+0

感謝您的信息和澄清喬希!嗯..有趣的問題,但.. :( – Aditya369 2012-04-22 12:27:27

+2

@ Aditya369也許你不應該紀念這個答案是正確的權利呢。你會從那個可能解決您的問題的答案來通過阻止其他人,因爲我真的只是告訴你爲什麼它不起作用。 – 2012-04-22 12:35:40