9 Stimmen

Annotieren einer Django-Abfrage über eine umgekehrte Beziehung

Ich habe zwei Modelle Property y Image , die durch einen Fremdschlüssel verbunden sind, so dass jeder Property hat mehrere Instanzen von Image . Ich versuche, einen Abfragesatz aller Eigenschaften abzurufen - mit Auflistung aller Felder - und der Anzahl der Bilder, die jede Eigenschaft hat. Ich bin mir bewusst, dass ich dies als zwei verschiedene Abfragen tun könnte, aber ich habe nicht das Gefühl, dass dies ein besonders eleganter Ansatz ist, und erweist sich als ein wenig ineffizient, da diese Informationen über XMLHttpRequest abgerufen werden.

Die Modelle sind wie folgt definiert:

class Property(models.Model):
    title = models.CharField('title', max_length=255)
    created = models.DateTimeField('created', auto_now_add=True)
    modified = models.DateTimeField('modified', auto_now=True)

    class Meta:
        pass

class Image(models.Model):
    prop_id = models.ForeignKey(Property)
    image_file = models.ImageField('image file', upload_to='/path/to/image/')

    class Meta:
        pass

Ich habe die hier veröffentlichte Antwort befolgt: Django-Aggregation über die umgekehrte Beziehung da ich glaube, dass dies ein ähnliches Problem war, aber ich habe festgestellt, dass dies ein leeres Queryset zurückgibt.

Vielen Dank für jede Hilfe, die jemand anbieten kann.

EDIT :

Die Abfrage, die ich durchgeführt habe, lautete:

Property.objects.all().annotate(image_count=Count('image')).order_by('-image_count')

EDIT 2:

Nach einigen Experimenten habe ich eine Lösung gefunden, obwohl ich mir ziemlich sicher bin, dass dies als Fehler / nicht dokumentiertes Problem einzustufen ist:

Property.objects.all().annotate(Count('image')).order_by('-image__count')
Property.objects.all().annotate(total_images=Count('image')).order_by('-total_images')

Beides funktioniert, aber die Benennung der Bemerkung image_count nicht. Ohne einen Blick in den Django-Quellcode zu werfen, kann ich nicht wirklich darüber spekulieren, warum das so ist.

6voto

Daniel Roseman Punkte 565786

Der Code, den Sie gepostet haben, sollte funktionieren - auf jeden Fall sollte er kein leeres Queryset zurückgeben, da annotate die Filterung der Hauptabfrage nicht beeinflusst.

Eine dumme Frage, aber sind Sie sicher, dass es in der Datenbank Eigenschaftselemente gibt?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X