【问题标题】:creating django model for existing database/sql view?为现有的数据库/sql 视图创建 django 模型?
【发布时间】:2011-01-15 19:13:03
【问题描述】:

我在 $template_dir/sql/$someTableName.sql 文件中插入了一个视图的定义。 (创建或替换视图)所以每次我运行syncdb 时,都会创建数据库视图。

我可以在 models.py 中创建一个访问该视图的 python 类吗?

只使用 python 的原始 sql 功能是否更好?

---编辑---

我遇到的另一个问题是视图没有主键,但 django 似乎假设会有一个,因为我收到错误 caught an exception while rendering: (1054, "Unknown column 'appName_currentleagues.id' in 'field list'") 但我没有定义这样的成员:

Class CurrentLeagues(models.Model):
        League = models.ForeignKey(League)
        class Meta:
                managed = False

所以我的猜测是 django 合理地认为我没有在 CurrentLeagues 类中定义主键,所以 Django 假设有一个名为 id 的主键。有没有办法告诉 Django 没有主键(因为这实际上是一个视图),或者这甚至不是我的问题?

【问题讨论】:

    标签: django django-models sql-view


    【解决方案1】:

    Unmanaged models

    您像往常一样定义模型并将managed = False 添加到元选项中:

    class MyModel(models.Model):
        ...
        class Meta:
             managed = False
    

    【讨论】:

    • 但是我如何将该 python 类与我希望它关联的 mysql 视图相关联?我是否需要正确显式键入“MyModel”的成员以匹配视图中字段的拼写,并且它只是以某种方式自动工作?
    • 我只需要将视图拼写为appName_classname,因为这是 django 自动为每个 python 模型实例使用的拼写。
    • 您可以使用db_table 元选项手动传递视图名称:docs.djangoproject.com/en/dev/ref/models/options/#db-table。是的,您需要输入字段名称,否则 django 不会有您的模型的 python 版本。如果你想减少打字量,你可以使用复杂的抽象模型和继承网络,但我会尽可能简单,即使这意味着一点重复。
    • 如果您在其中一个字段上设置primary_key=True,django 不会自动创建id 字段。看来您必须将一个字段作为主键。如果你使用 sqlite 或 oracle,你可能会逃脱这个黑客:groups.google.com/group/django-developers/browse_thread/thread/…
    【解决方案2】:

    尝试使用 python manage.py inspectdb 或 python manage.py inspectdb > models.py

    【讨论】:

      猜你喜欢
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 2011-01-09
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      相关资源
      最近更新 更多