Метод модели доступа для нескольких объектов в 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)