0

In View Function

it can show this error

Request Method:GETRequest URL:http://127.0.0.1:8000/inbox/Django Version:4.2.25Exception Type:ValueErrorException Value:Cannot query "admin": Must be "ChatMessage" instance.Exception Location:D:\Socialmedia\.venv\lib\site-packages\django\db\models\sql\query.py, line 1253, in check_query_object_typeRaised during:core.views.messages.inboxPython Executable:D:\Socialmedia\.venv\Scripts\python.exePython Version:3.9.13Python Path:['D:\\Socialmedia', 'C:\\Users\\ER-RPJ\\AppData\\Local\\Programs\\Python\\Python39\\python39.zip', 'C:\\Users\\ER-RPJ\\AppData\\Local\\Programs\\Python\\Python39\\DLLs', 'C:\\Users\\ER-RPJ\\AppData\\Local\\Programs\\Python\\Python39\\lib', 'C:\\Users\\ER-RPJ\\AppData\\Local\\Programs\\Python\\Python39', 'D:\\Socialmedia\\.venv', 'D:\\Socialmedia\\.venv\\lib\\site-packages']

def inbox(request):
    if request.user.is_authenticated:
        user_id = request.user
        chat_messages = ChatMessage.objects.filter(
            id__in=Subquery(
                User.objects.filter(
                    Q(chat_sender__chat_receiver=user_id) |
                    Q(chat_receiver__chat_sender=user_id)
                ).distinct().annotate(
                    last_msg=Subquery(
                        ChatMessage.objects.filter(
                            Q(sender=OuterRef('id'), receiver=user_id) |
                            Q(receiver=OuterRef('id'), sender=user_id)
                        ).order_by('-id')[:1].values_list('id', flat=True)
                    )
                ).values_list('last_msg', flat=True).order_by('-id')
            )
        ).order_by('-id')

        context = {
            'chat_messages': chat_messages,
        }
        return render(request, 'chat/inbox.html', context)


In My model

class ChatMessage(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='chat_user')
    chat_sender = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='chat_sender')
    chat_receiver = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='chat_receiver')

    message = models.TextField()
    is_read = models.BooleanField(default=False)
    date = models.DateTimeField(auto_now_add=True)
    mid=ShortUUIDField(length=7,max_length=25,alphabet='abcdefghijklmnopqrstuvwxyz')

    # def __str__(self):
    #     return self.user
    class Meta:
        verbose_name_plural = 'Chat messages'
2
  • please add a focused, answerable question to your post Commented Nov 10 at 3:42
  • What database do you use? Commented Nov 10 at 7:41

1 Answer 1

0

You probably can simplify this to:

def inbox(request):
    if request.user.is_authenticated:
        user_id = request.user
        chat_messages = ChatMessage.objects.filter(
            Q(chat_sender=user_id) | Q(chat_receiver=user_id),
            ~Exists(ChatMessage.objects.filter(
                Q(chat_sender=OuterRef('chat_sender'), chat_receiver=OuterRef('chat_receiver')) |
                Q(chat_sender=OuterRef('chat_receiver'), chat_receiver=OuterRef('chat_sender')),
                date__gt=OuterRef('date')
            ))
        ).order_by('-date')

        context = {
            'chat_messages': chat_messages,
        }
        return render(request, 'chat/inbox.html', context)
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.