我有两个模型 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'))
我有聊天和消息 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'))