我正在尝试使用 Django 模型从许多非规范化表中提取信息。这些表是预先存在的,是遗留 MySQL 数据库的一部分。
架构描述
假设每个表都描述了一个人的特征,并且每个人都有一个名字(这本质上标识了这个人,但不对应于一些统一的“Person”表)。例如:
class JobInfo(models.Model):
name = models.CharField(primary_key=True, db_column='name')
startdate = models.DateField(db_column='startdate')
...
class Hobbies(models.Model):
name = models.CharField(primary_key=True, db_column='name')
exercise = models.CharField(db_column='exercise')
...
class Clothing(model.Model):
name = models.CharField(primary_key=True, db_column='name')
shoes = models.CharField(db_column='shoes')
...
# Twenty more classes exist, all of the same format
通过 SQL 访问
在原始 SQL 中,当我想访问所有表中的信息时,我会做一系列丑陋OUTER JOIN
的 s,用一个WHERE
子句对其进行细化。
SELECT JobInfo.startdate, JobInfo.employer, JobInfo.salary,
Hobbies.exercise, Hobbies.fun,
Clothing.shoes, Clothing.shirt, Clothing,pants
...
FROM JobInfo
LEFT OUTER JOIN Hobbies ON Hobbies.name = JobInfo.name
LEFT OUTER JOIN Clothing ON Clothing.name = JobInfo.name
...
WHERE
Clothing.shoes REXEGP "Nike" AND
Hobbies.exercise REGEXP "out"
...;
基于模型的方法
我正在尝试将其转换为基于 Django 的方法,在那里我可以轻松地获得QuerySet
从所有表中提取信息的方法。
我已经研究过使用OneToOneField
(示例),使一个表有一个字段用于将其与其他表绑定。但是,这意味着一个表需要“中央”表,所有其他表都反向引用。这似乎与 20 多个字段混在一起,并且没有真正的示意图意义(“工作信息”是核心属性吗?衣服?)。
我觉得我正在以错误的方式解决这个问题。我应该如何QuerySet
在相关表上构建一个,其中每个表都有一个在所有表中通用的主键字段?