Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:获取manytomanyfield的最后一项_Python_Django_Django Models - Fatal编程技术网

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