Это упрощенные версии моих моделей (пользовательская модель - просто идентификатор и имя)
class Convo(models.Model):
owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='convo_owner')
users = models.ManyToManyField(User, through='Convo_user')
class Convo_user (models.Model):
user = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
convo = models.ForeignKey(Convo, on_delete=models.CASCADE)
class Comments(models.Model):
name = models.CharField(max_length=255)
content = models.TextField(max_length=1024)
convo = models.ForeignKey(Convo, on_delete=models.CASCADE)
Это мое мнение
class ConvoViewSet(viewsets.ModelViewSet):
serializer_class = serializers.ConvoSerializer
def get_queryset(self):
return None
def list(self, request):
curr_user = request.user.id
# Collecting the list of conversations
conversations = models.Conversation.object.filter(ConvoUser__user_id=request.user.id)
#Getting list of conversation id's
conv_ids = list(conversations.values_list('id', flat=True).order_by('id'))
#Getting list of relevant comments
comments = models.Comments.objects.filter(conversation_id__in=conv_ids)
return Response(self.get_serializer(conversations, many=True).data)
И мой текущий сериализатор
class ConvoSerializer(serializers.ModelSerializer):
"""A serializer for messaging objects"""
# access = AccessSerializer(many=True)
# model = models.Comments
# fields = ('id', 'name', 'content', 'convo_id')
class Meta:
model = models.Convo
fields = ('id', 'owner_id')
Текущий ответ, который я получаю, имеет форму
[
{
"id": 1,
"owner_id": 32
}, ...
]
Но я хотел бы добавить поле комментария, которое показывает все свойства комментариев в ответ, так что в основном все во второмqueryset (так называемые комментарии), и я не уверен, как это вообще сделать.(Я получаю комментарии так же, как и я, потому что пытаюсь свести к минимуму количество обращений к базе данных).Нужно ли создавать новое представление для комментариев, создавать собственный сериализатор и затем каким-то образом объединять их в сериализатор для convo?