Как получить количество записей в модели в django rest framework?
Я использую GenericAPIView и сериализатор в модели для получения данных из таблиц. Теперь я не могу понять, как я могу получить количество записей из таблицы в моем rest api.
Ниже приведен пример кода, в котором я получаю записи
urls.py
urlpatterns = [
path('ContactList/<int:user>/',views.ContactList.as_view()),
]
views.py
class ContactList(GenericAPIView, ListModelMixin):
def get_queryset(self):
username = self.kwargs['user']
return Contacts.objects.filter(user=username).order_by('-last_message')
serializer_class = ContactSerializer
permission_classes = (AllowAny,)
def get(self, request , *args, **kwargs):
return self.list(request, *args, **kwargs)
Serializers.py
class ContactSerializer(serializers.ModelSerializer):
class Meta:
model = Contacts
fields = ['id','user','Contact_id','last_message']
В приведенном выше коде я получаю все контакты определенного пользователя. Теперь как я могу получить количество записей (контактов), относящихся к этому пользователю.
например, если я пошлю пользователю 11 в URL, я должен получить количество записей, где user=11
Django Rest предлагает несколько способов фильтрации возвращаемого кверисета
- Использование параметра запроса :
Здесь у вас есть путь типа :
path('ContactList/',views.ContactList.as_view()),
И хотим запросить url следующим образом : localhost:8000/contact_list?user=11
Вам нужно определить ваш get_queryset
следующим образом :
def get_queryset(self):
queryset = Contacts.objects.all()
# If we have user in query parameter then
user = self.request.query_params.get('user')
if user is not None:
queryset = queryset.filter(user__id=user)
# Return the queryset
return queryset
- Использование параметра url :
У вас есть такой путь : path('ContactList/<int:user>/',views.ContactList.as_view()),
И хотим запросить url следующим образом : localhost:8000/contact_list/11
Вам нужно определить свой get_queryset следующим образом :
def get_queryset(self):
user = self.kwargs['user']
return Contacts.objects.filter(user__id=user)
если я правильно понимаю, вам нужно вернуть # записей помимо контактов
вы можете переопределить метод list
и сделать следующее
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
count = queryset.count()
return Response({"count":count, "data":serializer.data})
также вы можете добавить пагинацию, это решит проблему