Как я могу получить chatmessage_thread (я использую Django Rest Framework)
Я работаю над небольшим проектом (чат), используя Django Rest Framework / Channels
У меня небольшая проблема, я не могу получить chatmessage_thread я получаю это сообщение об ошибке :
'QuerySet' object has no attribute 'chatmessage_thread'
это мой serialize :
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
Вот мое мнение:
# Rest Framework
import datetime
from django.shortcuts import get_object_or_404
from rest_framework.response import Response
from rest_framework import viewsets, status, generics, filters
from rest_framework.parsers import JSONParser
from rest_framework.decorators import action
# Model + Serializer
from .serializers import ThreadSerializer
from chat.models import Thread
import pprint
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(objectS
это моя модель :
from django.db import models
from django.contrib.auth import get_user_model
from django.db.models import Q
User = get_user_model()
# Create your models here.
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)
erializer.data)
Я получаю ошибку после написания этой строки :
q = Thread.objects.by_user(user=request.user).prefetch_related('chatmessage_thread').order_by('timestamp')
q.chatmessage_thread.all()
Я следовал учебнику, (единственная разница между моим кодом и учебником в том, что я использую DRF)
Это код учебника на github : https://github.com/Omkar0231/Chat-app-tutorial/blob/master/chat/templates/messages.html
Как следует из ошибки, эта строка:
q = Thread.objects.by_user(user=request.user).prefetch_related('chatmessage_thread').order_by('timestamp')
возвращает кверисет, что означает, что у вас есть список Thread
объектов.
chatmessage_thread
принадлежит экземплярам Thread
, поэтому, чтобы получить его, необходимо выполнить итерации по каждому thread
s:
for thread in q:
thread.chatmessage_thread.all()