django.db.utils.OperationalError: (1054, “未知列

Ses*_* VS 7 django django-models django-orm

一个有趣的问题。获取未知列异常 - 请查找堆栈跟踪

我尝试获取新的潜在客户列表并回复潜在客户。我合并它们。当我合并它们时,有一个例外。

调试后发现new_leads方法排除了collection和delivery两个字段。如果我们把它排除在外,一切都很好。我的意思是不要检查另一个,如果我们同时包含两个过滤器,我们就会遇到问题。

我尝试使用过滤器/排除等,但它没有用。

查询集包含以下方法

    def all_leads_related_to_user(self, user):
    """ User new and past leads
    Use this queryset for performing lead search.
    """
    new_leads = self.new_leads_for_user(user)
    responded_leads = self.leads_responded_by_user(user)
    all_leads = (new_leads | responded_leads).distinct() <= Issue is here.
    return all_leads

    def new_leads_for_user(self, user):
     ....

    # User's location filter
    if user.sub_region_excluded_list:
        sub_region_exclude_list = [10, 12]
        qs = qs.exclude( Q(collection_point__sub_region_id__in=sub_region_exclude_list) |
                        Q(delivery_point__sub_region_id__in=sub_region_exclude_list)) 

                   # <== Make it just one exclude it works.


Model 

class Suburb(models.Model):
    state = models.ForeignKey(State, blank=False)
    sub_region = models.ForeignKey(SubRegion, blank=False)
    postcode = models.CharField(_('postcode'), blank=False, max_length=10)
    name = models.CharField(_('suburb name'), blank=False, max_length=200)

class Load(models.Model):
.....

collection_point = models.ForeignKey(Suburb, related_name='collection_point', on_delete=models.SET_NULL, null=True)
delivery_point = models.ForeignKey(Suburb, related_name='delivery_point', on_delete=models.SET_NULL, null=True)
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪:-

    >>> Load.objects.all_leads_related_to_user(User.objects.all()[0])
Load.objects.all_leads_related_to_user(User.objects.all()[0])
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/data/fq/venv/lib/python3.4/site-packages/django/db/models/query.py", line 226, in __repr__
    data = list(self[:REPR_OUTPUT_SIZE + 1])
  File "/data/fq/venv/lib/python3.4/site-packages/django/db/models/query.py", line 250, in __iter__
    self._fetch_all()
  File "/data/fq/venv/lib/python3.4/site-packages/django/db/models/query.py", line 1103, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/data/fq/venv/lib/python3.4/site-packages/django/db/models/query.py", line 53, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch)
  File "/data/fq/venv/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 886, in execute_sql
    raise original_exception
  File "/data/fq/venv/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 876, in execute_sql
    cursor.execute(sql, params)
  File "/data/fq/venv/lib/python3.4/site-packages/django/db/backends/utils.py", line 80, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/data/fq/venv/lib/python3.4/site-packages/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "/data/fq/venv/lib/python3.4/site-packages/django/db/utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/data/fq/venv/lib/python3.4/site-packages/django/utils/six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "/data/fq/venv/lib/python3.4/site-packages/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "/data/fq/venv/lib/python3.4/site-packages/django/db/backends/mysql/base.py", line 101, in execute
    return self.cursor.execute(query, args)
  File "/data/fq/venv/lib/python3.4/site-packages/MySQLdb/cursors.py", line 250, in execute
    self.errorhandler(self, exc, value)
  File "/data/fq/venv/lib/python3.4/site-packages/MySQLdb/connections.py", line 50, in defaulterrorhandler
    raise errorvalue
  File "/data/fq/venv/lib/python3.4/site-packages/MySQLdb/cursors.py", line 247, in execute
    res = self._query(query)
  File "/data/fq/venv/lib/python3.4/site-packages/MySQLdb/cursors.py", line 411, in _query
    rowcount = self._do_query(q)
  File "/data/fq/venv/lib/python3.4/site-packages/MySQLdb/cursors.py", line 374, in _do_query
    db.query(q)
  File "/data/fq/venv/lib/python3.4/site-packages/MySQLdb/connections.py", line 292, in query
    _mysql.connection.query(self, query)
django.db.utils.OperationalError: (1054, "Unknown column 'locations_suburb.sub_region_id' in 'having clause'")
>>> 
Run Code Online (Sandbox Code Playgroud)

我正在使用 MySqlDB

笔记:-

已应用所有迁移并且 Db 处于正确状态

更新

问题与创建 Have 子句时在 select 语句中可用的 MYSQL madating 列有关。请参阅- “具有子句”中的未知列。本例中的 Django 未添加为要选择的列。因此错误。我需要一些如何找到一种方法将它添加到带有其他参数的 select 子句中。

J. *_*ich 7

这通常在您尚未进行或应用迁移时弹出。具体来说,当您在 Django(或任何 ORM)中修改任何模型的字段时,您需要通知 SQL 服务器,以便它可以在其表中反映它。现代 Django 通过一系列迁移来实现这一点,因此如果您拥有项目生命周期中任何时间的数据,您可以通过简单地向前或向后运行迁移来在历史上任何时间的代码上运行它。

长话短说,MySQL 声称该sub_region字段不存在。您需要同步表格以反映您的模型。

有两个步骤,进行迁移并在您的服务器上运行它们,如下所示为您的locations应用程序。在运行第二个命令之前进行备份,尤其是在 MySQL 或 SQLite 上!

$ python manage.py makemigrations locations
$ python manage.py migrate locations 
Run Code Online (Sandbox Code Playgroud)

这将导致数据库服务器创建列,并且您不应再收到 OperationalError。


Ses*_* VS 5

这不是一个迁移问题。

当 MYSQL 有一个HAVINGClause 时,要求这些参数处于选中状态,如果未选中,则会抛出异常。因此我必须强制 Django 通过以下方式包含这两个字段:

qs = qs.annotate(collection_point__sub_region_id = F("collection_point__sub_region_id"),
                 delivery_point__sub_region_id = F("delivery_point__sub_region_id"))
Run Code Online (Sandbox Code Playgroud)