Django: проверьте шаблон, если набор запросов пуст - PullRequest
0 голосов
/ 04 мая 2019

Я нашел решение для этого, но пока только проверяя представления.Мне нужно проверить шаблоны.

Мой взгляд:

brands = Brand.objects.all()
for brand in brands:
    brand.products = Product.objects.filter(brand=brand.id)

И поэтому в моем шаблоне я хочу показать все свои бренды, но не те, которые не имеют какого-либо продукта.

{% for brand in brands %}
    {% if brand.product is not None %}
        <!-- Displays brand -->
    {% endif %}
{% endfor %}

Что-то в этом роде, но код is not None не работает для пустых наборов запросов, и он по-прежнему отображает бренды без объектов в них.Что я могу сделать?

РЕДАКТИРОВАТЬ: Совместное использование модели в соответствии с просьбой.

class Brand(models.Model):
    name = models.CharField(max_length=100, null=False)

    def __str__(self):
        return self.name


class Product(models.Model):
    name = models.CharField(max_length=100, null=False)
    brand = models.IntegerField(null=True)
    price = models.DecimalField(max_digits=12, decimal_places=2, null=False)

    def __str__(self):
        return self.name

Ответы [ 2 ]

2 голосов
/ 04 мая 2019

Ваш шаблон должен выглядеть так:

{% for brand in brands %}
    {% if brand.product %}
        <!-- Displays brand -->
    {% endif %}
{% endfor %}
1 голос
/ 04 мая 2019

Обычно не хорошая идея использовать 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
...