Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Django self join , Como converter esta consulta para consulta ORM


Será mais fácil fazer isso com um modelo de dados mais normalizado. Considere usar uma abordagem como esta:
class NodeGroup(model.Model):
    pass

class NodeHealth(model.Model):
    node_group = models.ForeignKey(NodeGroup, related_name='nodes')
    health_time = models.IntegerField()
    status = models.IntegerField()

Então você poderia fazer isso:
from django.db.models import Max, F

nodes = NodeHealth.objects.all().annotate(
    max_health_time=Max('node_group__nodes__health_time')
).filter(health_time=F('max_health_time'))

Infelizmente, nesse ponto, os nós retornados terão duplicatas com base se mais de um nó tiver o mesmo valor para health_time . Você pode adicionar um .distinct('node_group_id') isso poderia esclarecer isso, mas eu não sou 100% positivo.