我有两个模型 Chat 和 Message,如何使用 pub_date of Message 来订购 Chat?

i have two models Chat and Message and how can i order the Chat with the pub_date of Message?

我有聊天和消息 Model.How 我可以用 pub_date 消息对我的聊天进行排序吗 example:consider 我在两个聊天中(A 和 B):我希望每次收到 B 的消息时,B 应该位于 A 的顶部,当我收到 A 的消息时,A 应该位于顶部B 的顶部 这是我的 models.py:

from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _


class Chat(models.Model):
    DIALOG = 'D'
    CHAT = 'C'
    CHAT_TYPE_CHOICES = (
        (DIALOG, _('Dialog')),
        (CHAT, _('Chat'))
    )

    type = models.CharField(
        _('type'),
        max_length=1,
        choices=CHAT_TYPE_CHOICES,
        default=DIALOG
    )
    members = models.ManyToManyField(User, verbose_name=_("Participant"))

    def __str__(self):
        return 'members:[{}] - {}'.format(', '.join(self.members.all().values_list('username', flat=True)),self.type)
    class Meta:
        ordering = ['???? by pub_date of message ????']




class Message(models.Model):
    chat = models.ForeignKey(Chat, verbose_name=_("chat de discussion"),on_delete=models.CASCADE)
    author = models.ForeignKey(User, verbose_name=_("utilisateur"),on_delete=models.CASCADE)
    message = models.TextField(_("Message"))
    pub_date = models.DateTimeField(_('date de creation'), default=timezone.now)
    is_readed = models.BooleanField(_('Lu'), default=False)

    class Meta:
        ordering=['pub_date']

    def __str__(self):
        return self.message

我如何实施 it.i 在 this.Thanks 上花了很多时间。 为了澄清这是我的 views.py:

from django.shortcuts import render,redirect
from django.urls import reverse
from django.views import View
from .models import Chat
from .forms import MessageForm
from django.db.models import Count

class DialogsView(View):
    def get(self, request):
        chats = Chat.objects.filter(members__in=[request.user.id])???how to order by pub_date of Message ???
        return render(request, 'users/dialogs.html', {'user_profile': request.user, 'chats': chats})

class MessagesView(View):
    def get(self, request, chat_id):
        try:
            chat = Chat.objects.get(id=chat_id)
            if request.user in chat.members.all():
                chat.message_set.filter(is_readed=False).exclude(author=request.user).update(is_readed=True)
            else:
                chat = None
        except Chat.DoesNotExist:
            chat = None

        return render(
            request,
            'users/messages.html',
            {
                'user_profile': request.user,
                'chat': chat,
                'form': MessageForm()
            }
        )

    def post(self, request, chat_id):
        form = MessageForm(data=request.POST)
        if form.is_valid():
            message = form.save(commit=False)
            message.chat_id = chat_id
            message.author = request.user
            message.save()
        return redirect(reverse('messages', kwargs={'chat_id': chat_id}))

class CreateDialogView(View):
    def get(self, request, user_id):
        chats = Chat.objects.filter(members__in=[request.user.id, user_id], type=Chat.DIALOG).annotate(c=Count('members')).filter(c=2)
        if user_id != request.user.id:
            if chats.count() == 0:
                chat = Chat.objects.create()
                chat.members.add(request.user)
                chat.members.add(user_id)
            else:
                chat = chats.first()
            return redirect(reverse('messages', kwargs={'chat_id': chat.id}))
        else:
            return redirect(reverse('profile', kwargs={'pk': user_id}))

不确定这一行。

但想法是您在聊天中添加注释并为每个聊天“创建”一个新字段 (latest_message_time)。该字段等于其关联消息的最大值 pub_date.

Chat.objects.annotate(latest_message_time=Max('message__pub_date'))