Django QuerySet.update () завершается ошибкой MySQL, если подзапрос ссылается на базовую таблицу - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь сделать эту транзакцию mysql совместимой. Поскольку mysql не разрешает текущую операцию. MySQL не позволяет обновлять таблицу, которую вы уже используете во внутреннем выборе в качестве критерия обновления.

Получение этой ошибки

django.db.utils.OperationalError: (1093, "You can't specify target table 'catalogue_category' for update in FROM clause")

Код:

included_in_non_public_subtree = self.__class__.objects.filter(
    is_public=False, path__rstartswith=OuterRef("path"), depth__lt=OuterRef("depth")
)
self.get_descendants_and_self().update(
    ancestors_are_public=Exists(
    included_in_non_public_subtree.values("id"), negated=True)
)

https://github.com/django-oscar/django-oscar/pull/3050#pullrequestreview -461576714

1 Ответ

0 голосов
/ 06 августа 2020

Вы можете выполнить подзапрос самостоятельно. Разделите один запрос на несколько запросов.

например,

included_in_non_public_subtree = not self.__class__.objects.filter(
    is_public=False, path__rstartswith=OuterRef("path"), depth__lt=OuterRef("depth")
).exists()

self.get_descendants_and_self().update(
    ancestors_are_public=included_in_non_public_subtree,
)
...