【问题标题】:Django and weird legacy database tablesDjango 和奇怪的遗留数据库表
【发布时间】:2009-09-04 15:18:32
【问题描述】:

我正在尝试在 Django 中集成旧数据库。

由于糟糕的数据库设计导致一些奇怪的表出现问题,但我不能随意更改它。

问题是有些表没有主键ID,但是有产品ID,问题来了,很多表都是多个,例如某个列需要有多个值,例如

ID  |   ...   |  namestring

2   |   ...   |  name1
2   |   ...   |  name2 

是否有可能绕过通常的主键行为并编写一个函数,该函数为具有多行的此类 ID 返回一个对象?列名字符串可以变成一个列表。

不需要手动编辑,因为这是从另一个系统导出的数据,我只需要访问它..

【问题讨论】:

    标签: python django database legacy


    【解决方案1】:

    除非您添加唯一的主键列,否则 Django 的 ORM 将无法处理此表。

    如果您确实添加了主键,那么编写一个方法来查询给定的产品 ID 并返回与该产品 ID 对应的值的列表是很简单的。比如:

    def names_for(product_id):
        return [row.namestring for row in ProductName.objects.filter(product_id=product_id)]
    

    这个函数也可以是一个自定义的管理器方法,或者你的产品模型上的一个方法,或者任何对你来说最有意义的东西。

    编辑:假设您有一个 Product 模型,此表中的 product_id 引用了该模型,并且您对该表的唯一用途是查找给定产品的这些名称,您的另一种选择是将这个表完全排除在 ORM 之外,只需在 Product 上编写一个 uses raw SQL and cursor.execute 的方法来获取该产品的名称。这很好,很干净,不需要向表中添加唯一的 PK。您失去的主要是通过 Django 模型或管理员管理此表的能力。

    【讨论】:

    • 好的,谢谢,这似乎是一个合理的解决方案。如果有办法通过管理器或类似的方式以某种方式绕过实际对象访问,我会很高兴?
    猜你喜欢
    • 2016-02-15
    • 2011-01-17
    • 2013-08-07
    • 1970-01-01
    • 2011-10-26
    • 2011-11-21
    • 2021-08-26
    • 2017-03-19
    • 1970-01-01
    相关资源
    最近更新 更多