【问题标题】:how can i get chatmessage_thread ( i'm using Django Rest Framework )我怎样才能得到chatmessage_thread(我正在使用Django Rest Framework)
【发布时间】:2021-08-06 22:38:15
【问题描述】:

我正在使用 Django Rest Framework / Channels 开发一个小项目(聊天)

我有一个小问题,我无法获取 chatmessage_thread 我收到此错误消息:

'QuerySet' object has no attribute 'chatmessage_thread'

这是我的序列化:

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

【问题讨论】:

  • aalways 将完整的错误消息(从单词“Traceback”开始)作为文本(不是屏幕截图,不是链接到外部门户)有问题(不是评论)。还有其他有用的信息。
  • 教程不使用q.chatmessage_thread - 也许你应该得到q.all(),以后每个线程都使用chatmessage_thread

标签: python django django-rest-framework


【解决方案1】:

正如错误提示,这一行:

q = Thread.objects.by_user(user=request.user).prefetch_related('chatmessage_thread').order_by('timestamp')

返回一个查询集,这意味着您有一个 Thread 对象列表。

chatmessage_thread属于Thread的实例,所以为了得到它,你需要遍历每个threads:

for thread in q:
    thread.chatmessage_thread.all()

【讨论】:

    猜你喜欢
    • 2011-07-16
    • 1970-01-01
    • 2021-07-10
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    相关资源
    最近更新 更多