Количество элементов связанной таблицы DRF

Помогите пожалуйста, как решить эту проблему. Я создаю приложение API, используя DRF. У меня есть две таблицы, связанные с помощью ForeignKey. Я хочу отобразить количество элементов второй таблицы в первой таблице. То есть у меня есть таблица компании и принадлежащих ей магазинов. В таблице компаний я хочу отобразить количество магазинов, принадлежащих определенной сети магазинов.

В сериализаторе я создал функцию, которая должна возвращать количество элементов. Я пробовал делать это с «значениями» и «аннотациями», но результат всегда один и тот же. Возвращает общее количество магазинов, не связанных с конкретной компанией. Этот метод сериализатора:

def get_store_count(self, obj):
    obj = Store.objects.values('id').annotate(total=Count('company_name'))
    return obj

Модели:

class Retail(models.Model):
    company_name = models.CharField(max_length=150, verbose_name='название компании')
    sp = models.OneToOneField(SP, on_delete=models.CASCADE, verbose_name='ИП')
    opened_date = models.DateField(verbose_name='Дата создания', default=now)
    factory = models.ForeignKey(Factory, on_delete=models.DO_NOTHING, verbose_name='Завод')


class Store(models.Model):
    company_name = models.ForeignKey(Retail, on_delete=models.CASCADE, verbose_name='компания')
    store_name = models.CharField(max_length=150, verbose_name='название магазина')
    supplier = models.ForeignKey(Supplier, on_delete=models.DO_NOTHING, verbose_name='поставщик')
    debt_to_supplier = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='Задолженность перед поставщиком в RUB')
    creating_date = models.DateTimeField(verbose_name='дата создания', default=now)


Ответы (1 шт):

Автор решения: Iaroslav Lukianchik

Я думаю вам нужно добавить фильтрацию в запрос:

stores_count = Store.objects.filter(company_name=obj).values('id').annotate(total=Count('company_name'))

Если я правильно понял, то сериализатор у вас выглядит так:

class RetailSerializer(serializers.ModelSerializer):
    store_count = serializers.SerializerMethodField()
    
    class Meta:
        model = Retail
        fields = ['store_count']
    
    def get_store_count(self, obj):
        
        store_count = Store.objects.filter(company_name=obj).values('id').annotate(total=Count('company_name'))      
        return store_count.get('total')
→ Ссылка