Django - подсчет количества встроенных элементов в представлении на основе классов
У меня есть 2 модели: Product
и ProductComponent
. Как я могу подсчитать количество компонентов в каждом продукте, чтобы, когда я хочу зациклить продукты в шаблоне, он дал мне название и количество компонентов в каждом продукте?
class ProductComponent(models.Model):
name = models.CharField(max_length=255)
related_product = models.ForeignKey(Product, on_delete=models.CASCADE')
@property
def count_components(self):
return self.component_name.count()
class Product(models.Model):
title = models.CharField(max_length=400)
views.py
class TestView(ListView):
template_name = "test.html"
model = Product
def get_context_data(self, **kwargs):
context = super(TestView, self).get_context_data(**kwargs)
context['product_list'] = Product.objects.filter(?)
return context
Мне удалось сделать что-то подобное в админке, но только на странице ProductComponent
админки, но не на странице Product
админки.
admin.py
class TestViewAdmin(ImportExportModelAdmin):
resource_class = TestViewAdminResource
list_display = ('get_component_count',)
def get_component_count(self, obj):
return obj.related_product.related_product.count()
Я хочу создать цикл продуктов с рядом компонентов, которые связаны с этим продуктом.
{% for product in product_list %}
{{product.title}} - {{product.count_components}}
{% endfor %}
Буду благодарен за любые советы о том, как достичь чего-то подобного.
вы можете использовать обратный поиск, используя related_name
в ForeignKey или, если не указано, добавляя '_set' к имени связанной модели:
{{ product.productcomponent_set.count }}
Я рекомендую использовать параметр related_name
в ваших ForeignKeys, так как он делает более чистый и более описательный код в некоторых более сложных отношениях:
related_product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='components')
тогда вы получаете доступ к нему следующим образом:
{{ product.components.count }}
Больше информации об обратных отношениях в Django Docs