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)
answered Nov 10 at 7:41
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

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.