Является ли Pythonic / Djangoi c для методов модели A ссылкой на модель B? - PullRequest
1 голос
/ 30 апреля 2020

Предположим, у меня есть эти классы:

class Book(models.Model):

    title = models.CharField()
    authors = models.ManyToManyField(Author)

    def display_text(self):
        return f"{self.title} by {','.join([x.name for x in self.authors.all()])}"

class Author(models.model):

    first_name = models.CharField()
    last_name = models.CharField()

    def name(self):
        return f"{self.first_name} {self.last_name}"

Нормальный / приемлемый / стандартный способ действий, когда атрибуты одной модели относятся к другой таким образом? Это горячая дискуссия на работе, поскольку обе стороны «не делают этого, это может способствовать утечке числа запросов» и «это гораздо более читабельно, чем большинство альтернатив».

Есть ли сообщество? стандартное решение этой проблемы? Поиск цитат и ссылок.

1 Ответ

1 голос
/ 30 апреля 2020

Это и Pythoni c, и Djangoi c. Это может быть продемонстрировано тем фактом, что этот шаблон используется в самом Django.

# django/contrib/admin/models.py

class LogEntry(models.Model):

    # Code omitted for brevity

    content_type = models.ForeignKey(
        ContentType,
        models.SET_NULL,
        verbose_name=_('content type'),
        blank=True, null=True,
    )

    # Code omitted for brevity

    def get_edited_object(self):
        """Return the edited object represented by this log entry."""
        return self.content_type.get_object_for_this_type(pk=self.object_id)

    # Code omitted for brevity

Метод LogEntry.get_edited_object() вызывает метод ContentType.get_object_for_this_type().

# django/contrib/contenttypes/models.py

class ContentType(models.Model):

    # Code omitted for brevity

    def get_object_for_this_type(self, **kwargs):
        """
        Return an object of this type for the keyword arguments given.
        Basically, this is a proxy around this object_type's get_object() model
        method. The ObjectNotExist exception, if thrown, will not be caught,
        so code that calls this method should catch it.
        """
        return self.model_class()._base_manager.using(self._state.db).get(**kwargs)

    # Code omitted for brevity

Использование этот шаблон является распространенным и рекомендуемым. Функции, которые работают с экземпляром вашей модели, должны в максимально возможной степени быть методом этого класса модели. Это просто хорошее программирование на Pythoni c.

Как сказал Ахмед ...

Да, "нет другого решения".

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