Ich habe 3 Modelle:Django ORM-Filter von Max Spaltenwert von zwei verwandten Modellen
Program(Model):
... # which aggregates ProgramVersions
ProgramVersion(Model):
program = ForeignKey(Program)
index = IntegerField()
UserProgramVersion(Model):
user = ForeignKey(User)
version = ForeignKey(ProgramVersion)
index = IntegerField()
Programmversion und UserProgramVersion sind bestellbaren Modelle basierend auf index
Feld - Objekt mit dem höchsten index
in der Tabelle betrachtet wird latest/neueste Objekt (dies wird von einer benutzerdefinierten Logik behandelt, nicht relevant).
Ich möchte alle neuesten UserProgramVersions auswählen, d. H. Die letzten UPVs, die auf das gleiche Programm verweisen.
dies kann durch diese UserProgramVersion queryset behandelt werden:
def latest_user_program_versions(self):
latest = self\
.order_by('version__program_id', '-version__index', '-index')\
.distinct('version__program_id')
return self.filter(id__in=latest)
dies funktioniert aber feine Suche nach einer Lösung im, die nicht verwendet .distinct() habe ich versucht, so etwas wie dieses:
def latest_user_program_versions(self):
latest = self\
.annotate(
'max_version_index'=Max('version__index'),
'max_index'=Max('index'))\
.filter(
'version__index'=F('max_version_index'),
'index'=F('max_index'))
return self.filter(id__in=latest)
dies funktioniert jedoch nicht
Ich glaube nicht, dass es "gut funktioniert" ohne einen Filter von Benutzer oder Gruppe für Benutzer. Wenn Sie es jetzt weglassen, erhalten Sie möglicherweise eine Antwort, wo es später trotzdem nicht hinzugefügt werden kann. – hynekcer