Django order_by无法正常工作

时间:2018-03-17 19:45:30

标签: python django

我试图通过最后一条消息获取所有订阅的对话,但是当我使用order_by clausule时,会重复对话。

没有order_by的查询:

conversaciones = Conversacion.objects.filter(usuarios=request.user)

结果(按对话分组但未按最近的最后一条消息排序):

Grouped by Conversations but not ordered by the most recent last message first

使用order_by查询:

conversaciones = Conversacion.objects.filter(usuarios=request.user).order_by('-mensaje__fechaEnvio')

结果:

WTF

我的models.py:

class Mensaje(models.Model):
    remitente = models.ForeignKey('Usuario', on_delete=models.CASCADE, related_name='remitente')
    destinatario = models.ForeignKey('Usuario', on_delete=models.CASCADE, related_name='destinatario')
    cuerpo = models.TextField(validators=[MaxLengthValidator(750)]) 
    leido = models.BooleanField(default=False)
    fechaEnvio = models.DateTimeField(auto_now_add=True)
    conversacion = models.ForeignKey('Conversacion', on_delete=models.CASCADE)

    class Meta:
        ordering = ['-fechaEnvio'] 

    def __str__(self):
        return str(self.remitente) + ' -> ' + str(self.destinatario)


class Conversacion(models.Model):
    usuarios = models.ManyToManyField('Usuario', related_name='usuarios')
    agresion = models.ForeignKey('Agresion', on_delete=models.CASCADE)

    @property
    def ultimoMensaje(self):
        return self.mensaje_set.latest('fechaEnvio')

2 个答案:

答案 0 :(得分:1)

正如@jota所建议的,我可以在您的模型Mesanje中添加一些内容。订购元组,别忘了添加逗号。

class Mesanje(models.Model):
      ........
      class Meta:
           ordering = ('-fechaEnvio',)

答案 1 :(得分:0)

我找到了解决方案:

conversaciones = Conversacion.objects.filter(usuarios=request.user).annotate(max_fecha=Max('mensaje__fechaEnvio')).order_by('-max_fecha')

我使用MySQL所以我不能使用与params不同的东西。