python - 更新查询集时使用模型字段的值进行字符串连接

标签 python mysql django

我想将某些用户的电子邮件 ID 更新为:“前缀”+“用户电子邮件的值”

现在我可以为一个用户执行此操作,如下所示:

User.objects.filter(pk=<id>).update(email=Concat(Value("prefix"), 'email'))

但是,一旦我过滤 pk 列表,我就会收到一个严重的错误。查询是:

User.objects.filter(pk__in=<list_id>).update(email=Concat(Value("prefix"), 'email'))

错误是:

/Users/zishanahmad/Devel/Env/venv_sliderule/lib/python2.7/site-packages/django/db/models/query.pyc in update(self, **kwargs)
    561         query.add_update_values(kwargs)
    562         with transaction.atomic(using=self.db, savepoint=False):
--> 563             rows = query.get_compiler(self.db).execute_sql(CURSOR)
    564         self._result_cache = None
    565         return rows

/Users/zishanahmad/Devel/Env/venv_sliderule/lib/python2.7/site-packages/django/db/models/sql/compiler.pyc in execute_sql(self, result_type)
   1060         related queries are not available.
   1061         """
-> 1062         cursor = super(SQLUpdateCompiler, self).execute_sql(result_type)
   1063         try:
   1064             rows = cursor.rowcount if cursor else 0

/Users/zishanahmad/Devel/Env/venv_sliderule/lib/python2.7/site-packages/django/db/models/sql/compiler.pyc in execute_sql(self, result_type)
    838         cursor = self.connection.cursor()
    839         try:
--> 840             cursor.execute(sql, params)
    841         except Exception:
    842             cursor.close()

/Users/zishanahmad/Devel/Env/venv_sliderule/lib/python2.7/site-packages/django/db/backends/utils.pyc in execute(self, sql, params)
     77         start = time()
     78         try:
---> 79             return super(CursorDebugWrapper, self).execute(sql, params)
     80         finally:
     81             stop = time()

/Users/zishanahmad/Devel/Env/venv_sliderule/lib/python2.7/site-packages/django/db/backends/utils.pyc in execute(self, sql, params)
     62                 return self.cursor.execute(sql)
     63             else:
---> 64                 return self.cursor.execute(sql, params)
     65 
     66     def executemany(self, sql, param_list):

/Users/zishanahmad/Devel/Env/venv_sliderule/lib/python2.7/site-packages/django/db/utils.pyc in __exit__(self, exc_type, exc_value, traceback)
     96                 if dj_exc_type not in (DataError, IntegrityError):
     97                     self.wrapper.errors_occurred = True
---> 98                 six.reraise(dj_exc_type, dj_exc_value, traceback)
     99 
    100     def __call__(self, func):

/Users/zishanahmad/Devel/Env/venv_sliderule/lib/python2.7/site-packages/django/db/backends/utils.pyc in execute(self, sql, params)
     62                 return self.cursor.execute(sql)
     63             else:
---> 64                 return self.cursor.execute(sql, params)
     65 
     66     def executemany(self, sql, param_list):

/Users/zishanahmad/Devel/Env/venv_sliderule/lib/python2.7/site-packages/django/db/backends/mysql/base.pyc in execute(self, query, args)
    122         try:
    123             # args is None means no string interpolation
--> 124             return self.cursor.execute(query, args)
    125         except Database.OperationalError as e:
    126             # Map some error codes to IntegrityError, since they seem to be

/Users/zishanahmad/Devel/Env/venv_sliderule/lib/python2.7/site-packages/MySQLdb/cursors.pyc in execute(self, query, args)
    224         except Exception:
    225             exc, value = sys.exc_info()[:2]
--> 226             self.errorhandler(self, exc, value)
    227         self._executed = query
    228         if not self._defer_warnings: self._warning_check()

/Users/zishanahmad/Devel/Env/venv_sliderule/lib/python2.7/site-packages/MySQLdb/connections.pyc in defaulterrorhandler(***failed resolving arguments***)
     34     del connection
     35     if isinstance(errorvalue, BaseException):
---> 36         raise errorvalue
     37     if errorclass is not None:
     38         raise errorclass(errorvalue)

OperationalError: (1093, "You can't specify target table 'auth_user' for update in FROM clause")

我不太明白错误消息的意思。任何帮助将不胜感激。

编辑: MySQL版本:5.7.12 Django :1.8

最佳答案

你的<list_id>是什么?看起来像? User.objects.filter(pk__in=<list_id>的结果是什么)?

在Django 1.10中,我运行没有问题:

>>> User.objects.filter(pk=1).update(first_name='Test')
1L
>>> User.objects.filter(pk__in=[1, 2]).update(first_name='Test')
2L

至于解决方法,显然它的效率不高,但为什么不直接缓存 QuerySet,然后迭代它来更新每个对象呢? (希望)这是一次一次性查询,因此我不确定 SQL 效率有多重要。

关于python - 更新查询集时使用模型字段的值进行字符串连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42934377/

相关文章:

python - python有没有类似Java的JPS的工具

mysql - HSQLDB:选择查询优先于插入查询

mysql - 获取 2 个不同相关表中两个字段的总和

python - 如何通过多对多字段的模型进行过滤?

django - 如何将多对多情况下的多个选择字段更改为多个输入字段?

python - 获取 IOError : [Errno Invalid number of channels] -9998 when using mic with PyAudio on Raspberry Pi

python - 如何从python中带有方括号的正则表达式输出中提取内容

django - 在到达 View 集之前记录所有 REST API 请求

python - 从嵌套字典中提取值出现的次数

MySQL 权限——即使使用 'CREATE ROUTINE' 授权也无法创建函数