Mysql
 sql >> Base de données >  >> RDS >> Mysql

Django self join , Comment convertir cette requête en requête ORM

Vous aurez plus de facilité à le faire avec un modèle de données plus normalisé. Envisagez d'utiliser une approche comme celle-ci :

class NodeGroup(model.Model):
    pass

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

Alors vous pourriez faire ceci :

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'))

Malheureusement, à ce stade, les nœuds renvoyés auront des doublons si plusieurs nœuds ont la même valeur pour health_time . Vous pourrez peut-être ajouter un .distinct('node_group_id') cela pourrait clarifier cela, mais je ne suis pas sûr à 100 %.