#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()