Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Django self join , So konvertieren Sie diese Abfrage in eine ORM-Abfrage

Mit einem stärker normalisierten Datenmodell wird Ihnen dies leichter fallen. Erwägen Sie einen Ansatz wie diesen:

class NodeGroup(model.Model):
    pass

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

Dann könnten Sie Folgendes tun:

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

Leider weisen die zurückgegebenen Knoten an diesem Punkt Duplikate auf, wenn mehr als ein Knoten den gleichen Wert für health_time hat . Möglicherweise können Sie eine .distinct('node_group_id') hinzufügen das könnte das klären, aber ich bin nicht 100 % sicher.