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

Вернуться на верх