Получить количество объектов в сериализаторе, где поле внешнего ключа равно x

#django #django-models #django-rest-framework #django-views #django-serializer

Вопрос:

Предположим

 class ABC(models.Models):
    ...
    id = models.SlugField(...)
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    ...
 

Теперь я хочу что-то вроде

    [{id: adfsdd, no_of_user_objects: 5}, {id: gdfvsdf, no_of_user_objects: 0}, {id: ergthf, no_of_user_objects: 2}]
 

Как мне этого добиться?

Ответ №1:

Метод модели для получения количества пользователей, имеющих одинаковый идентификатор slug:

 class ABC(models.Models):
    ...
    id = models.SlugField(...)
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    ...

    @property # for using in serializer
    def no_of_user_objects(self):
        return ABC.objects.filter(id=self.id).count()
 

И в вашем сериализаторе есть пользовательский сериализатор для сериализатора набора запросов:

 class ABDSerializer(serializers.ModelSerializer):
     class Meta:
        model = ABC
        fields = ['id', 'no_of_user_objects']

# in your view
queryset = ABC.objects.distinct('id')
serializer = ABDSerializer(queryset, many=True)
print(serializer.data)
# get you    [{id: adfsdd, no_of_user_objects: 5}, {id: gdfvsdf, #no_of_user_objects: 0}, {id: ergthf, no_of_user_objects: 2}]
 

Комментарии:

1. Количество запросов будет огромным.

2. поскольку эти данные меняются со временем, а не статичны, как в БД, я не думаю, что существуют другие способы получения таких данных, если вы не напишете выражение запроса для взаимодействия с самой базой данных. @RoyalBosS если вы хотите отображать в списке, разбиение на страницы не приведет к значительному замедлению

3. я просто хочу подсчитать

4. @RoyalBosS это то, что делает мой метод модели, он подсчитывает () количество пользователей с одинаковым идентификатором

5. на самом деле нет, если вы реализуете разбивку на страницы в своем представлении, оно не будет запрашивать всю базу данных. Например, эти документы django-rest-framework.org/api-guide/pagination , docs.djangoproject.com/en/3.2/topics/pagination . Я использовал метод model во всех своих проектах с миллионами наборов данных, и я не вижу медлительности, потому что я реализовал разбивку на страницы. В основном медленный запрос связан с запросом внешнего ключа, который мы не делаем, даже с запросом внешнего ключа вы можете ускорить его с помощью select_related()