我正在尝试使用 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在相关表上构建一个,其中每个表都有一个在所有表中通用的主键字段?