#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
скройте пароль