我试图通过最后一条消息获取所有订阅的对话,但是当我使用order_by
clausule时,会重复对话。
没有order_by的查询:
conversaciones = Conversacion.objects.filter(usuarios=request.user)
结果(按对话分组但未按最近的最后一条消息排序):
使用order_by查询:
conversaciones = Conversacion.objects.filter(usuarios=request.user).order_by('-mensaje__fechaEnvio')
结果:
我的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')
答案 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不同的东西。