Метод модели доступа для нескольких объектов в Django

Допустим, я создал модель в Django, которая выглядит следующим образом:

class Book(models.Model):
    author = models.CharField(max_length=64)
    ... (other attributes)

    def author_pretty(self):
        return "[··" + self.author +  "··]"

Мне нужно получить из всех объектов в БД метод author_pretty, на данный момент я делаю так:

authors = Book.objects.values_list('author', flat=True)
authors_pretty = ["[·" + author +  "·]" for author in authors]
# or
books = Book.objects.all()
authors_pretty = [book.author_pretty() for book in books]

Есть ли способ сделать это одним вызовом? Django все равно придется делать запрос к БД и вызывать метод, но может быть есть более чистое решение, которое я упускаю.

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

@property
def author_pretty(self):
        return "[··" + self.author +  "··]"

Однако, если вы хотите что-то более чистое и по какой-то причине вам нужно все сразу, загляните в Django Docs for Concat, Query Expressions и Annotate

from django.db.models.functions import Concat
from django.db.models import Value, CharField

Book.objects.all().annotate(author_pretty=Concat(Value(“[··”), “author”, Value(“··]”), output_field=CharField()))

А затем вы можете использовать его в цикле for как свойство

for author in authors:
    print(author.author_pretty)
Вернуться на верх