Как фильтровать объекты в Django на основе связанных полей? - PullRequest
0 голосов
/ 23 октября 2018

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

  • Product
  • Store
  • ProductStore (дополнительная таблица с внешними ключами для Store и Product, также Boolean 'включена', и фондовая (целое число))

Вопросы:

Как я могу отфильтровать 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 Ответ

0 голосов
/ 24 октября 2018

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

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

Таким образом, будет возвращено QuerySet, содержащее только Product s, для которого есть , связанное 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 (удовлетворяющего фильтрации).

...