Django:来自不同数据库的两个模型

时间:2013-12-30 20:47:45

标签: python django

我是Django的新手;我有一个遗留数据库,我无法控制我的服务器上的用户和数据库的一些信息,其中包含与用户正在做的事情有关的数据。我想通过Django使用的ORM方法从每个数据库中获取一些信息并将其显示在webform上,但我很挣扎。我搜索患者ID并找到他们与之关联的代码,但是当显示每个代码的成本及相关数据时,我不知道最好的方法。我目前不保存这些数据。

(我的数据库)

class Data(models.Model):
    code = models.CharField(max_length=12)
    cost = models.FloatField()
    unit = models.CharField(max_length=2)

(传统)

class UserHistory(models.Model)
   userid= models.IntegerField(db_column='userid', blank=True, null=True) 
   code = models.CharField(db_column='code', max_length=11, blank=True)
   firstname = models.CharField(db_column='FirstName', max_length=35, blank=True) 
   middlename = models.CharField(db_column='MiddleName', max_length=35, blank=True) 
   lastname = models.CharField(db_column='LastName', max_length=35, blank=True) 

期望的输出:

以下是用户名字姓氏的费用

Last Name |  First Name |    Code  |  Cost
----------+-------------+----------+--------
xxx       |     zzzzz   |       2  |  10.00
xxx       |     zzzzz   |       6  |  10.00
xxx       |     zzzzz   |       7  |  10.00
xxx       |     zzzzz   |      11  |  10.00

2 个答案:

答案 0 :(得分:2)

它位于Django文档中:https://docs.djangoproject.com/en/dev/topics/db/multi-db/,特别是您可以创建two querysets from different databases

您必须从第一个查询集export them as a list获取结果,并使用该列表查询第二个数据库(using the in operator)。

示例

 user = UserHistory.objects.using('legacy').filter(firstname='John', lastname='Doe')
 codes = list(users.values_list('code', flat=True))
 costs = Data.objects.using('default').filter(code__in=codes)

您可以使用聚合(例如Sum)或直接将costs查询集传递给您的RequestContext。

编辑: 该示例返回单个用户的所有Data。从user变量,您可以访问所有用户属性(例如user.middlename)。

答案 1 :(得分:0)

您实际上可以在settings.py文件中指定多个数据库,并让不同的模型使用不同的数据库。在设置模块中,使用DATABASE_ROUTERSdb_for_readdb_for_writeallow_relation四种方法将allow_syncdb设置为对象元组。前两个方法采用模型并返回数据库以用于该模型。 django docs提供了更多信息,一如既往的优秀。

我发现这种方法优于furnis,因为您只需要配置一次,而不是每次查询。您的问题正是数据库路由器存在的原因。