【问题标题】:Django models foreign key not recognizing 'QueryString' BaseObjectDjango 模型外键无法识别“QueryString”BaseObject
【发布时间】:2016-08-23 17:56:27
【问题描述】:

我目前正在一个 Docker 实例中处理一个 Django 1.5.2 项目,该项目与一个单独的 Docker 实例中的 mysql 数据库通信。我试图通过创建一个中间表来创建两个表之间的多对多关系,该表包含两个指向需要连接的两个表的外键。当我运行python manage.py syncdb 时出现问题,它向终端吐出以下错误:NameError: name 'QueryString' is not definedQueryString 在我的模型中明确定义。

这是我的模型...

class Tag(models.Model):
    name = models.CharField(max_length=100)

class QueryStringTab(models.Model):
    tag = models.ForeignKey(Tag, related_name='querystringtab')
    querystring = models.ForeignKey(QueryString, related_name='querystringtab')

class QueryString(BaseObject): 
    """
    Query string holds an SQL statement and query properties for execution
    """

    server_id = models.IntegerField()
    schema = models.CharField(max_length=255, blank=True)
    query = models.CharField(max_length=60000) 
    variables = models.TextField(blank=True)
    created_by = models.ForeignKey(User, related_name='queries_created')
    updated_by = models.ForeignKey(User, related_name='queries_last_edited')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField()
    touched_by = models.CharField(max_length=1000)
    config = models.TextField(blank=True)
    runs_started = models.IntegerField(default=0)
    runs_completed = models.IntegerField(default=0)
    runs_completed_duration = models.IntegerField(default=0) # total number of seconds spent running this query to completion
    formats = "pretty_html html json prettyjson csv excel tableau".split()

值得注意的点...
1) 它可以很好地识别Tag 模型。
2) 这是否与 QueryStringBaseObject 的事实有关
3) 在mysql数据库中创建Tag表成功

谁能发现我做错了什么明显的事情?

【问题讨论】:

  • 据我所知,如果你想使用 Django 自动生成的数据库访问 API,你需要使用 models.Model 类。所以我想你对#2) 的直觉是对的。
  • BaseObject 类是什么?

标签: python mysql django orm docker


【解决方案1】:

QueryStringTab 的声明在 QueryStringTab 之前;因此,当 Python 计算第一个时,它还没有看到第二个的任何定义,因此报告了 NameError。

Django 允许您在以下情况下使用字符串目标而不是类对象:

querystring = models.ForeignKey('QueryString', related_name='querystringtab')

或者,您可以简单地将 QueryStringTab 的定义移到末尾。

【讨论】:

  • 非常感谢!我刚刚再次从 JS 切换到 Python,对基础知识有点生疏。你可能刚刚让我免于被我的 PM 责骂。最美好的祝愿!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-01
  • 2021-08-22
  • 2020-05-07
相关资源
最近更新 更多