Django-Python / MySQL:如何访问模型中不存在于模型字段中的表的字段?

时间:2011-03-27 07:43:41

标签: django django-models

这就是我想要做的事情:

我有一个从另一个数据库导入的表。其中一个表的大多数列看起来像这样:AP1 | 00:23:69:33:C1:4F并且它们中有很多。我不认为python会接受它们作为字段名称。

我想要汇总它们,而不必将它们列为模型中的字段。我希望尽可能从Django应用程序中触发聚合,所以我不想在应用程序之外创建MySQL查询。

感谢。

2 个答案:

答案 0 :(得分:2)

除非你想编写原始sql,否则你将不得不定义一个模型。由于您的模型字段的名称不必与它们所代表的列相同,因此您可以为字段指定有用的名称。

class LegacyTable(models.Model):
    useful_name = models.IntegerField(db_column="AP1|00:23:69:33:C1:4F")

    class Meta:
        db_table = "LegacyDbTableThatHurtsMyHead"
        managed = False # syncdb does nothing

你也可以这样做。只要您需要在旧数据库表中使用其他列,只需将another_useful_name添加到您的模型中,并将db_column设置为您感兴趣的列。

这有两个可靠的好处。一,你不再需要编写原始sql。第二,你不必预先定义所有的字段。

另一种方法是在raw sql中定义所有字段。

编辑:

Legacy Databases描述了一种检查现有数据库并从现有模式生成models.py文件的方法。这个可以帮助你完成所有繁重的工作(空值,长度,类型,字段)。然后,您可以修改定义以满足您的需求。

python manage.py inspectdb > legacy.py

答案 1 :(得分:0)

http://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly

Django允许您执行原始SQL查询。如果没有关于您的表格的更多信息,那就是我能提供的所有信息。

自定义查询:

def my_custom_sql():
    from django.db import connection, transaction
    cursor = connection.cursor()

    # Data modifying operation - commit required
    cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
    transaction.commit_unless_managed()

    # Data retrieval operation - no commit required
    cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
    row = cursor.fetchone()

    return row

访问其他数据库:

from django.db import connections
cursor = connections['my_db_alias'].cursor()
# Your code here...
transaction.commit_unless_managed(using='my_db_alias')