Получение пяти товаров из базы с помощью Django ORM

Возьмите срез QuerySet: Product.objects.order_by('pk')[:5]. В SQL это ограничит результат пятью строками; сортировка по pk делает выбор воспроизводимым, но не случайным.

Короткий ответ

Что ответить на собеседовании

Возьмите срез QuerySet: Product.objects.order_by('pk')[:5]. В SQL это ограничит результат пятью строками; сортировка по pk делает выбор воспроизводимым, но не случайным.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо выбрать любые пять записей из модели Product, используя возможности Django ORM. В качестве основы используйте приведённые ниже модели.

from django.db import models

class Category(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

class Tag(models.Model):
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name

class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    tags = models.ManyToManyField(Tag, related_name='products')

    def __str__(self):
        return self.name

Ответ

Возьмите срез QuerySet: Product.objects.order_by('pk')[:5]. В SQL это ограничит результат пятью строками; сортировка по pk делает выбор воспроизводимым, но не случайным.

Пример:

products = Product.objects.order_by('pk')[:5]

Запрос выполняется при обходе или другом вычислении QuerySet. Если товаров меньше пяти, вернутся все имеющиеся. «Любые» не означает «случайные»: order_by('?') может быть дорогим на большой таблице и здесь не нужен. При последующем выводе category используйте select_related, а для tags — prefetch_related, чтобы не создавать дополнительные запросы на каждый товар.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее