Когда использовать ленивый перевод в Django
Когда в Django требуется ленивый перевод строковых объектов? В документации говорится, что такие значения опций, как verbose_name и help_text должны быть лениво переведены. А как насчет других опций, таких как related_name и through? Какова цель ленивого перевода опций verbose_name и help_text?
Каково значение ленивого перевода для полей, являющихся атрибутами уровня класса?
Эти функции хранят ленивую ссылку на строку - не фактический перевод. Сам перевод будет выполнен, когда строка будет использоваться в строковом контексте, например, при рендеринге шаблона.
Это необходимо, когда вызовы этих функций находятся в путях кода, которые выполняются во время загрузки модуля.
Это может легко произойти при определении моделей, форм и модельных форм, поскольку Django реализует их таким образом, что их поля фактически являются атрибутами уровня класса. По этой причине обязательно используйте ленивые переводы в следующих случаях:
class Course(models.Model):
def __str__(self):
return self.title
title = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
subscribers = models.ManyToManyField(User, through='Subscription')
class MyThing(models.Model):
kind = models.ForeignKey(
ThingKind,
on_delete=models.CASCADE,
related_name='kinds',
verbose_name=_('kind'),
)
Ваш вопрос говорит о том, что вы не понимаете ленивость python.
lazy translation - это только обещание дать вам когда-нибудь строку с действительно переведенным текстом. Но если вам это не нужно, то этого не произойдет.
У нас есть много преимуществ, если мы создадим ленивый объект:
- ничего не происходит, мы создали только обещание.
- мы можем работать с lazy object как с обычным объектом.
- только если нам это действительно нужно - мы можем разрешить обещание.
- если вы правильно работаете с ленивыми объектами - действительно увеличиваете скорость вашего синхронного кода.
У нас есть недостатки:
- ничего не происходит, вы не можете увидеть или отладить результат обещания до того, как обещание будет разрешено.
- дополнительная ленивая обертка имеет свои издержки: память и задержка, если вам нужен результат.
- 90% разработчиков python не понимают этого. Они получают только проблему с ленивыми объектами.
Генератор является лучшим примером - он совершенен и быстр. большинство программистов не используют генераторы: знаменитые curio или asyncio полностью забыты из-за лени.
Мне не нравится как работает ленивый перевод в django, поэтому я создал свою собственную библиотеку Django-tof (Translation-On-Fly). https://github.com/wP-soft-GmbH/django-tof
Теперь ответ на вопрос:
Вам следует использовать ленивый перевод, если:
- У вас есть статичный текст, но не всегда вам нужен перевод этого текста. 99 % в Django .
- У вас статичный текст, вам нужен перевод этого текста в 100%, но переводы приходят с задержкой. Например: Объект имеет init с переведенным текстом до загрузки блока переводов. Редкие элементы, которые должны делать что-то на старте проекта. Например: пользовательский Testrunner и сообщения о процессе. 0.01% в Django. .
- если вы не беспокоитесь о скорости/потреблении памяти вашей функции. 99.99% в python. .