Django: как указать verbose_name с _meta без импорта модели? - PullRequest
2 голосов
/ 10 января 2020

Вот простое определение модели, использующее импорт для внешнего ключа:

from companies.models.owner_company import OwnerCompany

class Restaurant(models.Model):
    owner_company = models.ForeignKey(OwnerCompany,
                                      on_delete=models.PROTECT,
                                      verbose_name=OwnerCompany._meta.verbose_name)

Допустим, теперь мне нужно определить его без импорта объекта OwnerCompany. В этом случае, как бы вы определили verbose_name?

class Restaurant(models.Model):
    owner_company = models.ForeignKey('companies.OwnerCompany',
                                      on_delete=models.PROTECT,
                                      verbose_name='???')

1 Ответ

2 голосов
/ 10 января 2020

Вы можете создать «прокси-объект», который за str(..) вернет подробное имя. Например:

from django.apps import apps

class VerboseName:

    def __init__(self, app_name, model_name=None):
        if self.model_name is None:
            self.app_name, self.model_name = app_name.split('.', 1)
        else:
            self.app_name = app_name
            self.model_name = model_name

    def __str__(self):
        return str(apps.get_model(self.app_name, self.model_name)<b>._meta.verbose_name</b>)

Тогда мы можем использовать этот VerboseName объект:

class Restaurant(models.Model):
    owner_company = models.ForeignKey(
        'companies.OwnerCompany',
        on_delete=models.PROTECT,
        <b>verbose_name=VerboseName('companies', 'OwnerCompany')</b>
    )

или с точкой:

class Restaurant(models.Model):
    owner_company = models.ForeignKey(
        'companies.OwnerCompany',
        on_delete=models.PROTECT,
        <b>verbose_name=VerboseName('companies.OwnerCompany')</b>
    )

Название приложения Однако здесь требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...