Как заставить данные модели отображаться в виде поля в ответе другой модели - PullRequest
0 голосов
/ 27 февраля 2019

Это упрощенные версии моих моделей (пользовательская модель - просто идентификатор и имя)

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?

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

Данные не отображаются, потому что мои сериализаторы используют базу данных по умолчанию, не знаю почему, но шаг вперед

РЕДАКТИРОВАТЬ:

Django: База данных, используемая для prefetch_related, отличается отродительский запрос При условии правильного ответа я смог выбрать базу данных этим методом, потому что по каким-то причинам внутренние запросы используют базу данных по умолчанию

0 голосов
/ 27 февраля 2019

Как вы настроили свои модели, вы можете получить доступ к комментариям каждого Convo через ORM Django, используя convo_object.comments_set.all(), так что вы можете настроить ConvoSerializer для доступа к этомукомментарии экземпляра, например:

class ConvoSerializer(serializers.ModelSerializer):
"""A serializer for messaging objects"""

    comments_set = CommentSerializer(many=True)

    class Meta:
       model = models.Convo
       fields = ('id', 'owner_id', 'comments_set')

, а затем вы определяете свой CommentSerializer как:

class CommentSerializer(serializers.ModelSerializer):

    class Meta:
       model = models.Comments
       fields = ('id', 'name', 'content')
...