Как фильтровать объекты в 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
объект (который удовлетворяет фильтрации).