Searilizer в Django Rest framework не работает так, как ожидалось
Ниже перечислены мои перлизаторы:
class MessageSearlizer(serializers.ModelSerializer):
class Meta:
model = Message
fields = "__all__"
#This isnt working as expected
class ChatSearilizer(serializers.ModelSerializer):
messages: MessageSearlizer(many=True)
first_participant: serializers.SerializerMethodField()
second_participant: serializers.SerializerMethodField(
)
def get_first_participant(self, obj):
return {
"id": obj.first_participant.pk,
"name": obj.first_participant.name,
"photo": obj.first_participant.photo.file.url,
}
def get_second_participant(self, obj):
return {
"id": obj.second_participant.pk,
"name": obj.second_participant.name,
"photo": obj.second_participant.photo.file.url,
}
class Meta:
model = Chat
fields = "__all__"
Ниже приведены мои модели:
class Chat(models.Model):
first_participant = models.ForeignKey(
Profile, on_delete=models.CASCADE, related_name="first_participant")
second_participant = models.ForeignKey(
Profile, on_delete=models.CASCADE, related_name="second_participant")
date_modified = models.DateTimeField(auto_now=True)
class Message(models.Model):
chat = models.ForeignKey(Chat, on_delete=models.CASCADE)
sender = models.ForeignKey(
to=Profile, on_delete=models.CASCADE, related_name="sender", null=True) # This null is temporary will remove it
receiver = models.ForeignKey(
to=Profile, on_delete=models.CASCADE, related_name="receiver", null=True) # This null is temporary will remove it
text = models.TextField()
timestamp = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.text
class Meta:
ordering = ["timestamp"]
Ниже приведены мнения:
class UserChats(generics.ListAPIView):
serializer_class = ChatSearilizer
# get all the chats in which user is involved
def get_queryset(self):
return Chat.objects.filter(Q(first_participant=self.request.user.profile) |
Q(second_participant=self.request.user.profile))
class ChatDetail(generics.RetrieveAPIView):
serializer_class = ChatSearilizer
def get_queryset(self):
return Chat.objects.filter(pk=self.kwargs.get('pk'))
class SendMessageView(generics.CreateAPIView):
serializer_class = ChatSearilizer
def post(self, request, *args, **kwargs):
new_request = request
chat_id = new_request.data["chat_id"]
text = new_request.data["text"]
sender = self.request.user.profile.pk
receiver = new_request.data["receiver"]
# check if chat_id is present in request body
if chat_id:
try:
chat = Chat.objects.get(pk=chat_id)
data = {"chat": chat.pk, "text": text,
"sender": sender, "receiver": receiver}
return create_message(data)
except ObjectDoesNotExist:
return json_response(status=400, data={
"error": "invalid chat id provided"})
# if chat id is not present check if chat between the sender and receiver already exists
try:
chat = Chat.objects.get(Q(first_participant=sender, second_participant=receiver) | Q(
first_participant=receiver, second_participant=sender))
data = {"chat": chat.pk, "text": text,
"sender": sender, "receiver": receiver}
return create_message(data)
except ObjectDoesNotExist:
# chat does not exist so create new chat
searlizer = ChatSearilizer(
data={"first_participant": sender, "second_participant": receiver})
if searlizer.is_valid():
chat = searlizer.save()
data = {"chat": chat.pk, "text": text,
"sender": sender, "receiver": receiver}
return create_message(data)
return Response(searlizer.errors, status=status.HTTP_400_BAD_REQUEST)
def create_message(data):
sr = MessageSearlizer(data=data)
if sr.is_valid():
sr.save()
return json_response(status=200, data=sr.data)
return Response(sr.errors, status=status.HTTP_400_BAD_REQUEST)
Не работает перлизатор чата, мне нужен массив сообщений в чате, но этого массива нет. Также не работают методы получения фейлов. Я просто получаю простые идентификаторы первого участника и второго участника. Кода стало слишком много в этом вопросе, но я чувствую, что все это важно для понимания. Заранее спасибо