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;

问题2:如何queryset()使用函数编写对应的using函数?

4

1 回答 1

3

数据库路由器可以帮助您避免在查询集上使用using()。您通知 django 哪些数据库用于哪些模型。我建议您彻底阅读有关路由器的文档,因为它们可能会很痛苦(我们在工作中使用它们)。

请注意以下几点:

如果 myapp 中的任何模型包含与其他数据库之外的模型的关系,则此示例将不起作用。跨数据库关系引入了 Django 当前无法处理的引用完整性问题。

Django 不处理跨数据库连接,无论您是否想使用键连接。如果您需要来自两个模型的数据,您可以执行两个单独的查询,并在代码中自己进行连接。我不知道这将如何适用于管理员。

另一种方法是创建一个视图,在数据库本身中加入跨数据库表。但是,您将无法保存实例。

希望这是您调查的良好起点。

于 2012-04-22T11:11:57.347 回答