Django: 解决 OperationalError: (1093, "You can't specify target table 'xxx' for update in FROM clause")

    图片来源: http://avalonstar.com/journal/2008/the-web-framework-for-ponies/

    错误信息如下:

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

    当使用类似如下代码时,会出现以上问题:

    user_ids = User.objects.filter(
        pk__gt=10
    ).values_list('pk', flat=True)
    
    
    User.objects.filter(id__in=user_ids).update(a=123)
    

    解决办法:将第一个结果转换为列表

    user_ids = list(user_ids)
    

    出现问题的原因是,上面报错的代码试图生成这样的 sql 语句:

    update user set a=1234 where id in (
        select id from user where id > 10
    )
    

    这条语句是有问题的。 而修改后的代码生成的 sql 语句是这样的:

    update user set a=1234 where id in (
        1, 2, 3
    )
    

    Comments