Python Django:获取manytomanyfield的最后一项
对于这些型号:Python Django:获取manytomanyfield的最后一项,python,django,django-models,Python,Django,Django Models,对于这些型号: class Message(models.Model): text = models.CharField(max_length=200) date_send = models.DateTimeField(auto_now_add=True,editable=False) emeteur = models.ForeignKey(User,null=True,related_name="+") class Meta : abstrac
class Message(models.Model):
text = models.CharField(max_length=200)
date_send = models.DateTimeField(auto_now_add=True,editable=False)
emeteur = models.ForeignKey(User,null=True,related_name="+")
class Meta :
abstract = True
class MessagePerso(Message) :
read_at = models.DateTimeField(("read at"), null=True, blank=True)
class Conversation(models.Model):
title = models.CharField(max_length=90)
creator = models.ForeignKey(User,null=True,related_name="CreatorConversation")
recipient = models.ForeignKey(User,null=True,related_name="RecipientConversation")
created_at = models.DateTimeField(auto_now_add=True,editable=False)
messages = models.ManyToManyField(MessagePerso)
因此,对于每一次对话,我都希望看到最后一条消息的文本(对话中的ManyToManyField)和其他信息。
所以现在,我有这个:
def .. :
u = request.user
conversations = Conversation.objects.filter(Q(creatorr=u)|Q(destinataire=u)).annotate(nbMsg=Count('messages'),date=Max('messages__date_send')).order_by('date','id')
我没有为每个对话创建最后一条消息的文本,它是如何生成的?您可以按
日期\u send
字段按升序排列数据,如下所示:
而不是您最后使用以下方法获取的每个对话的消息:
def.:
u=请求用户
conversation_id_list=conversation.objects.filter(Q(creatorr=u)| Q(destinataire=u)).values_list('id',flat=True)
消息列表=列表()
对于对话\u id\u列表中的id:
last_message=MessagePerso.objects.filter(会话id=id).last()
消息列表。追加(最后一条消息)
打印(最后一条消息.文本)
如果会话的数量很大,并且希望最小化db查询,那么可以使用
def.:
u=请求用户
conversation_list=conversation.objects.filter(Q(creatorr=u)| Q(destinataire=u)).preftech_相关(‘消息’)
消息\u dict=dict()
对于对话列表中的对话:
消息\u dict.update({
converstaion.id:conversation.messages.all()
})
最后消息列表=列表()
对于对话id,消息目录项()中的消息列表:
如果消息列表:
last_message=messages_dict.get(会话id)[len(消息列表)-1:]
最后消息列表。追加(最后消息)
打印(最后一条消息.文本)
没有人能帮我?非常感谢你的帮助!但我决定不显示上一条消息的文本…我记录了你的解决方案;)我希望它能起作用
class Message(models.Model):
text = models.CharField(max_length=200)
date_send = models.DateTimeField(auto_now_add=True,editable=False)
emeteur = models.ForeignKey(User,null=True,related_name="+")
class Meta :
abstract = True
ordering = ['date_send'] # default ordrer while fetching data