Фишки Django #1

Блог Полезное

Фишки Django #1

Фишки Django #1

В статье речь пойдет о полезных советах для тех, кто изучает Django. Расскажу немного о том, как желательно использовать методы Django в некоторых случаях. Эти советы помогут вам добится быстродействия и быстрого отклика вашей базы данных.

И так поехали.

Доступ к полю Foreign Key


Правильно


shop.book_id


Неправильно


shop.book.id

Например, у вас есть foreign key book, Django автоматически создает primary key в качестве book_id. И теперь в базе данных содержится ссылка на этот экземпляр. Если вы захотите получить доступ к полю через shop.book.id, то вы создадите дополнительный запрос к базе данных, а это вам не к чему.

Пакетная вставка в ManyToManyFields


Правильно


post.groups.add(administrators, managers)


Неправильно


post.groups.add(administrators)
post.groups.add(managers)

Посчитать объекты Queryset

Если вам нужен подсчет объектов, то используйте count().


Правильно


books = Book.objects.all()
books.count()

# или в шаблоне...
{{ books.count }}



Неправильно


books = Book.objects.all()
len(books)

# или в шаблоне...
{{ books|length }}


Проверка на пустой Queryset


Правильно


books = Book.objects.all()
if books.exists():
# Do something...


Неправильно


books = Book.objects.all()
if books:
# Do something...

Выборка из Queryset


Правильно


book = Book.objects.select_related('author').first()
name = book.author.first_name


Неправильно


book = Book.objects.first()
name = book.author.first_name

Выбрать только то, что вам нужно

К примеру у вас модель, которая имеет 50 и более полей, а вам нужно вывести всего 3 или 4 поля. Не нужно передавать в контекст всю модель, давайте попробуем передать только те поля, которые нам нужны.


Правильно


# views.py
# если вам нужны только экземпляры модели, делаем так:
books = Book.objects.values('number', 'date', 'value') # Вернет словарь

# если вам нужен еще и доступ к методам, то делаем так:
books = Book.objects.only('number', 'date', 'value') # Вернет queryset

# books.html
<table>
{% for item in books %}
<tr>
<td>{{ item.number }}</td>
<td>{{ item.date }}</td>
<td>{{ item.value }}</td>
</tr>
{% endfor %}
</table>



Не правильно


# views.py
books = Book.objects.all()

# books.html
<table>
{% for item in books %}
<tr>
<td>{{ item.number }}</td>
<td>{{ item.date }}</td>
<td>{{ item.value }}</td>
</tr>
{% endfor %}
</table>


Пакетное обновление


Правильно


from django.db.models import F

Book.objects.update(price=F('price') * 2.5)



Неправильно


books = Book.objects.all()
for item in books:
item.price *= 1.2
item.save()

Надеемся кому-нибудь пригодятся наши заметки.