Количество элементов связанной таблицы 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 шт):
Я думаю вам нужно добавить фильтрацию в запрос:
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')