我是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
答案 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_ROUTERS
,db_for_read
,db_for_write
和allow_relation
四种方法将allow_syncdb
设置为对象元组。前两个方法采用模型并返回数据库以用于该模型。 django docs提供了更多信息,一如既往的优秀。
我发现这种方法优于furnis,因为您只需要配置一次,而不是每次查询。您的问题正是数据库路由器存在的原因。