Как фильтровать объекты в Django на основе связанных полей?

У меня есть модели:

  • Товар
  • хранить
  • ProductStore (дополнительная таблица с внешними ключами для Store а также Product, также логическое 'enabled' и stock(целое число))

Вопросы:

Как я могу фильтровать Productс, который имеет Enabled=True для текущего store__id (из запроса)? Кроме того, как я могу добавить дополнительное поле для каждого объекта со склада в текущем магазине?

ОБНОВЛЕНО:

class Product(models.Model): 
   pass 
class Store(models.Model):
   pass
class ProductStoreInfo(models.Model):
   enabled = models.BooleanField(default=True)
   product = models.ForeignKey(Product, related_name='stock_info', on_delete=models.CASCADE)
   store = models.ForeignKey(Store, related_name="stock", on_delete=models.CASCADE)
   stock = models.IntegerField(verbose_name=_('Stock'), blank=True, null=True, default=0, max_length=255)
   price = models.FloatField(verbose_name=_('Price'), blank=True, null=True, max_length=255)

1 ответ

Решение

Вы можете отфильтровать это с помощью:

Product.objects.filter(
    stock_info__enabled=True
    stock_info__store_id=my_store_id
)

Таким образом, это вернет QuerySet который содержит только Productс которой есть связанный ProductStoreInfo для которого enabled является True и store_id это my_store_id (должно быть заменено выражением, которое приводит к такому идентификатору).

Мы также можем аннотировать наш набор запросов данными о запасах, например:

from django.db.models import F, Min

Product.objects.filter(
    stock_info__enabled=True
    stock_info__store_id=my_store_id
).annotate(
    stock=Min(F('store_info__stock'))
)

Здесь Product объекты из набора запросов будут иметь дополнительный атрибут .stock который содержит stock колонка соответствующего ProductStore объект (который удовлетворяет фильтрации).

Другие вопросы по тегам