Результат группировки по и вложенности в Django Rest Framework
Я работаю в API и хочу упорядочить по id DESC, но хочу также группировать по client_id, чтобы все вопросы от одних и тех же клиентов были упорядочены, вложенные результаты:
Вот мой код:
models.py
class QuestionsModel(models.Model):
id = models.IntegerField()
publication_id = models.IntegerField(blank=True, null=True)
publication_title = models.CharField(max_length=255)
publication_link = models.CharField(max_length=255)
question = models.CharField(max_length=255)
member_id = models.IntegerField()
client_id = models.IntegerField()
class Meta:
managed = False
db_table = 'questions'
serializers.py
class QuestionsSerializer(serializers.ModelSerializer):
class Meta:
model = QuestionsModel
fields = '__all__'
views.py
class QuestionsAPIView(generics.ListAPIView):
def get_queryset(self):
queryset = ''
member_id = self.request.query_params.get('member_id')
if member_id is not None and member_id.isnumeric():
queryset = QuestionsModel.objects.filter(member_id=member_id).order_by('-id')
return queryset
Результат:
{
"id": 848484,
"publication_id": 4444,
"publication_title": "Title publication",
"publication_link": "Link",
"question": "This is a test question",
"member_id": 123456,
"client_id": 500
}
Что я хочу: Группировать вопросы по идентификатору клиента, так что желаемый выходной JSON может быть таким:
{
"client_id": 500,
"question" : [
"id": 848484,
"publication_id": 4444,
"publication_title": "Title publication",
"publication_link": "Link",
"question": "This is a test question",
"member_id": 123456,
"client_id": 500
],
[
"id": 848485,
"publication_id": 4445,
"publication_title": "Title publication",
"publication_link": "Link",
"question": "This is a test question",
"member_id": 123456,
"client_id": 500
]
}
Примечания: Я использую SQL Server в качестве движка базы данных.
Если между клиентами и вопросами существует отношение "один ко многим", я бы посоветовал создать модель клиента и иметь отношение внешнего ключа между вопросами и их клиентами. Тогда вы сможете легче использовать сериализаторы моделей DRF и вложенные отношения.
https://www.django-rest-framework.org/api-guide/relations/#nested-relationships
Вот упрощенная версия того, чего, как я думаю, вы пытаетесь достичь:
models.py
class Client(models.Model):
id = models.IntegerField(primary_key=True)
class Question(models.Model):
id = models.IntegerField(primary_key=True)
question = models.CharField(max_length=255)
client_id = models.ForeignKey(to=Client,on_delete=models.CASCADE,related_name='questions')
serializers.py
class QuestionSerializer(serializers.ModelSerializer):
class Meta:
model = Question
fields = '__all__'
class ClientSerializer(serializers.ModelSerializer):
questions = QuestionSerializer(many=True, read_only=True)
class Meta:
model = Client
fields = ['id','questions']
views.py
class ClientList(generics.ListAPIView):
queryset = Client.objects.all()
serializer_class = ClientSerializer
Если я подключу это представление к URL и вызову GET на нем, результирующая структура данных будет такой:
[
{
"id": 1,
"questions": [
{
"id": 1,
"question": "questions 1",
"client_id": 1
},
{
"id": 2,
"question": "questions2",
"client_id": 1
},
{
"id": 3,
"question": "questions3",
"client_id": 1
}
]
}
]
Я не уверен, кто будет использовать ваш API, но мне, как человеку, много работающему с REST, эта структура данных кажется более интуитивно понятной, чем та, которую вы предложили. Это список клиентских объектов (хотя и содержащий только один в данном примере), с вложенным списком объектов вопросов ниже. Расширяйте свои модели и уточняйте набор вопросов по своему усмотрению!