Size: a a a

Django [ru] #STAY HOME

2020 July 08

AG

Artem Gubatenko in Django [ru] #STAY HOME
Sergey Matveyev
Всем привет!
Товарищи расскажите как вы обходите проблему циклических импортов методов моделей?
То есть у меня отдельный файл с моделями, отдельный - lib.py, там функции соответственно храню. Переопределяю метод save например у какой-то из моделей, указываю что при сохранении нужно выполнить вот эту функцию из модуля lib, в котором импортируется модель из этого же модуля, соответственно рекурсия, энтропия, отчаяние. Я понимаю что можно импортировать нужную ф-цию не в models.py, а в непосредственн в save, но это как-то криво по ощущениям. Есть какие-то архитектурные решения, которые этих проблем помогут избежать?
Получай модели из apps.get_model("<app name>", "<model name>")

импорт from django.apps import apps
источник

RS

Rust Saiargaliev in Django [ru] #STAY HOME
Если у тебя циклические импорты между моделями и твоей lib.py - значит они сильно взаимосвязаны. Либо абстрагируй логику этой либы как-то, либо объединяй, как мне кажется
источник

DT

Dan Tyan in Django [ru] #STAY HOME
Artem Gubatenko
без values() тоже самое
а вот если заменить OuterRef() на, допустим 1 везде в Case(), то все норм отрабатывает.

Получается с .values() все корректно, тем более в Subquery() ожидается значение одного столбца из 1 строки в таблице
ну была догадка

судя по ошибку твой большой подзапрос выполняется раньше чем попадет в родительский запрос

нужно только найти где это происходит
источник

SM

Sergey Matveyev in Django [ru] #STAY HOME
Artem Gubatenko
Получай модели из apps.get_model("<app name>", "<model name>")

импорт from django.apps import apps
Да это шило на мыло, тогда в lib-модуле будут повторяющиеся импорты
источник

AG

Artem Gubatenko in Django [ru] #STAY HOME
Sergey Matveyev
Да это шило на мыло, тогда в lib-модуле будут повторяющиеся импорты
какие повторяющиеся импорты?
источник

SM

Sergey Matveyev in Django [ru] #STAY HOME
Rust Saiargaliev
Если у тебя циклические импорты между моделями и твоей lib.py - значит они сильно взаимосвязаны. Либо абстрагируй логику этой либы как-то, либо объединяй, как мне кажется
А можешь какой-то на пальцах пример привести - как абстрагировать логику?
источник

DT

Dan Tyan in Django [ru] #STAY HOME
Sergey Matveyev
Ну это норм вообще считается? Если ты такой код например увидишь, плеваться не будешь?
ну сам так пишу, не часто но приходится
источник

RS

Rust Saiargaliev in Django [ru] #STAY HOME
Sergey Matveyev
А можешь какой-то на пальцах пример привести - как абстрагировать логику?
Для этого нужен твой пример того что у тебя происходит
источник

SM

Sergey Matveyev in Django [ru] #STAY HOME
Artem Gubatenko
какие повторяющиеся импорты?
В lib.py будет много таких строк значит - apps.get_model("<app name>", "<model name>")
источник

SM

Sergey Matveyev in Django [ru] #STAY HOME
Dan Tyan
ну сам так пишу, не часто но приходится
Понял, в любом случае спасибо
источник

AG

Artem Gubatenko in Django [ru] #STAY HOME
Sergey Matveyev
В lib.py будет много таких строк значит - apps.get_model("<app name>", "<model name>")
считай это получением класса модели из списка всех моделй хранящихся в джанго

Иначе будешь делать локальные импорты моделей, тоже самое повторение, только с проблемами как сейчас
источник

d

d.sky in Django [ru] #STAY HOME
Nire
кастом
а если не кастом?
источник

AG

Artem Gubatenko in Django [ru] #STAY HOME
Dan Tyan
ну была догадка

судя по ошибку твой большой подзапрос выполняется раньше чем попадет в родительский запрос

нужно только найти где это происходит
спасибо, будем думать

А вообще был опыт использования OuterRef() в Case()? Это вообще работает?
источник

SM

Sergey Matveyev in Django [ru] #STAY HOME
Rust Saiargaliev
Для этого нужен твой пример того что у тебя происходит
Есть проект. у проекта есть волна (то есть цикл всех операций по проекту повторяются раз в месяц, это называется волной), это модели. Есть база с контактами для каждой волны, при сохранении новой волны я запускаю на эту базу функцию base_handle (условно), хранящуюся в либ-модуле.
В том же либ модуле есть например другая ф-ция, которая пробегается по всем экземплярам модели волна и проверяет не пора ли сменить статус open на closed (по дате). Для неё соответственно нужен импорт модели волны (причём хотелось бы один раз на весь либ-модуль, так как аналогичных функций дофига на самом деле). Как-то примерно так.
источник

SM

Sergey Matveyev in Django [ru] #STAY HOME
Artem Gubatenko
считай это получением класса модели из списка всех моделй хранящихся в джанго

Иначе будешь делать локальные импорты моделей, тоже самое повторение, только с проблемами как сейчас
У меня нет проблем с локальным импортом, отлично всё работает. Я считаю само по себе наличие локального импорта проблемой, так как оно плодит повторяющиеся строки в одном модуле. И без разницы какие это строки - from models import ModelName или `apps.get_model("<app name>", "<model name>")` или такой же импорт ф-ций в моделях.
Вернее я считал это проблемой, Dan Tyan вот говорит норм это
источник

DT

Dan Tyan in Django [ru] #STAY HOME
Artem Gubatenko
спасибо, будем думать

А вообще был опыт использования OuterRef() в Case()? Это вообще работает?
у меня нет

я если честно стараюсь таких больших запросов не писать
источник

RS

Rust Saiargaliev in Django [ru] #STAY HOME
Sergey Matveyev
Есть проект. у проекта есть волна (то есть цикл всех операций по проекту повторяются раз в месяц, это называется волной), это модели. Есть база с контактами для каждой волны, при сохранении новой волны я запускаю на эту базу функцию base_handle (условно), хранящуюся в либ-модуле.
В том же либ модуле есть например другая ф-ция, которая пробегается по всем экземплярам модели волна и проверяет не пора ли сменить статус open на closed (по дате). Для неё соответственно нужен импорт модели волны (причём хотелось бы один раз на весь либ-модуль, так как аналогичных функций дофига на самом деле). Как-то примерно так.
А почему эта вторая функция которая пробегается по модели волна и явно принадлежит ей лежит отдельно, а не внутри модельки, классметодом например?
источник

AG

Artem Gubatenko in Django [ru] #STAY HOME
Sergey Matveyev
У меня нет проблем с локальным импортом, отлично всё работает. Я считаю само по себе наличие локального импорта проблемой, так как оно плодит повторяющиеся строки в одном модуле. И без разницы какие это строки - from models import ModelName или `apps.get_model("<app name>", "<model name>")` или такой же импорт ф-ций в моделях.
Вернее я считал это проблемой, Dan Tyan вот говорит норм это
это не импорт)
если проследить исходники, то увидишь return self.models[model_name.lower()]
Ну если не нравится - ок
источник

SM

Sergey Matveyev in Django [ru] #STAY HOME
Rust Saiargaliev
А почему эта вторая функция которая пробегается по модели волна и явно принадлежит ей лежит отдельно, а не внутри модельки, классметодом например?
Она достаточно длинная (110 строк), я такое стараюсь выносить в либу. Неправильный подход?
источник

SM

Sergey Matveyev in Django [ru] #STAY HOME
Artem Gubatenko
это не импорт)
если проследить исходники, то увидишь return self.models[model_name.lower()]
Ну если не нравится - ок
Ну да, тут больше про вкусовщину, я понимаю что работать будет норм)
источник