Я не вижу chatmessage_thread в своем результате сериализатора

#python #django #django-rest-framework

Вопрос:

Я работаю над небольшим проектом с использованием фреймворка Django Rest, к которому я хотел бы получить доступ chatmessage_thread . Я не вижу chatmessage_thread в своем результате, должен ли я что-то добавить в свой сериализатор ?

Это мой запрос:

 class ThreadViewSet(viewsets.GenericViewSet):

    queryset = Thread.objects.all()
    serializer_class = ThreadSerializer


    def list(self, request):
        objectSerializer = self.serializer_class(Thread.objects.by_user(user=request.user).prefetch_related('chatmessage_thread').order_by('timestamp'), many=True)
        return Response(objectSerializer.data)
 

Это мой сериализатор:

 from rest_framework import serializers
from chat.models import Thread
from datetime import date

class ThreadSerializer(serializers.ModelSerializer):

    class Meta:
        model = Thread
        fields = '__all__'
        depth = 1
 

должен ли я добавить что-то в свой сериализатор?

Это моя модель:

 from django.db import models
from django.contrib.auth import get_user_model
from django.db.models import Q

User = get_user_model()


class ThreadManager(models.Manager):
    def by_user(self, **kwargs):
        user = kwargs.get('user')
        lookup = Q(first_person=user) | Q(second_person=user)
        qs = self.get_queryset().filter(lookup).distinct()
        return qs


class Thread(models.Model):
    first_person = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='thread_first_person')
    second_person = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True,
                                     related_name='thread_second_person')
    updated = models.DateTimeField(auto_now=True)
    timestamp = models.DateTimeField(auto_now_add=True)

    objects = ThreadManager()
    class Meta:
        unique_together = ['first_person', 'second_person']


class ChatMessage(models.Model):
    thread = models.ForeignKey(Thread, null=True, blank=True, on_delete=models.CASCADE, related_name='chatmessage_thread')
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    message = models.TextField()
    timestamp = models.DateTimeField(auto_now_add=True)
 

Мне нужна помощь, пожалуйста

Комментарии:

1. Да, вам нужно добавить сериализатор для ChatMessage и добавить его в качестве поля в ThreadSerializer

2. @bdbd можете ли вы помочь мне больше, пожалуйста ( пример )

Ответ №1:

Да, вам нужно добавить сериализатор для ChatMessage и добавить его в качестве поля ThreadSerializer . Что-то вроде этого:

 class ChatMessageSerializer(serializers.ModelSerializer):
    class Meta:
        model = ChatMessage
        fields = '__all__'


class ThreadSerializer(serializers.ModelSerializer):
    chatmessage_thread = ChatMessageSerializer(many=True)
    class Meta:
        model = Thread
        fields = '__all__'
        depth = 1
 

Комментарии:

1. есть ли какой-нибудь способ скрыть поле пароля 🙂 ? от сериализатора

2. Я предполагаю, что это для first_person и second_person ? Я думаю, что в этом случае вам нужно вручную определить User сериализатор для обоих этих полей (и скрыть там пароль) и не использовать depth .

3. можете ли вы просто объяснить мне шаги без написания кода, пожалуйста, я понял вашу идею, просто мне нужно больше ( я новичок в django ) Заранее большое вам спасибо

4. То же самое с тем , что мы сделали для ChatMessageSerializer , на этот раз напишите один для пользователя. И определите поля person в вашем ThreadSerializer , чтобы использовать этот сериализатор. Что-то вроде: first_person = MyUserSerializer() . Затем внутри MyUserSerializer скройте пароль