Обычно не хорошая идея использовать IntegerField
s и т. Д. Для представления отношений.Джанго использует ForeignKey
[Django-doc] для реализации таких отношений.Для этого есть несколько преимуществ: (1) это добавит дополнительные ограничения в базу данных, так что ключ может ссылаться только на реальный Brand
;и (2) у вас будут дополнительные способы извлечения связанных Product
s.
Таким образом, модель Product
должна иметь ForeignKey
для Brand
модели, например:
class Product(models.Model):
name = models.CharField(max_length=100, null=False)
<b>brand = models.ForeignKey(Brand, null=True, db_column='brand')</b>
price = models.DecimalField(max_digits=12, decimal_places=2, null=False)
Здесь мы оставляем саму структуру базы данных нетронутой, но она добавит ForeignKey
к ней, а также index , что сделает поиск всех продуктов для данного Brand
намного быстрее.
Обычно плохая идея писать (бизнес) логику в шаблонах.Фактически, одна из причин, по которой язык шаблонов Django не позволяет совершать вызовы с параметрами и т. Д., Заключается в том, чтобы люди не писали в шаблоне бизнес-логику.Поэтому я настоятельно советую вам переместить логику в представление.
Вы можете извлечь Brand
s, которые, по крайней мере, имеют один связанных Product
в представлении с однострочником:
Brand.objects.filter(<b>product__isnull=False</b>).distinct()
Так что не необходимо проверять каждую марку в отдельности.Здесь мы также проверяем наличие Product
в одном запросе для всех Brand
с, а не на дополнительный запрос на Brand
, чтобы проверить, есть ли связанные Product
s.
В результате запрос будет выглядеть следующим образом:
SELECT DISTINCT brand.*
FROM brand
INNER JOIN product ON brand.id = product.brand_id
WHERE product.id IS NOT NULL