Seite 1 von 1

[Django] Effizienter Test auf Enthaltensein?

Verfasst: Mittwoch 6. August 2008, 08:44
von sma
Ich habe einen Container und ein Item.

Code: Alles auswählen

class Container(models.Model):
    pass

class Item(models.Model):
    containers = models.ManyToManyField(Container, related_name='items')
Nun möchte ich feststellen, ob ein Item in einem bestimmten Container steckt. Naiv wie ich bin, dachte ich mir, ein

Code: Alles auswählen

if item in container.items: ...
wird's schon richten, aber das geht nicht. Auch ein

Code: Alles auswählen

if item in container.items.all(): ...
ist nicht, was ich will, denn das holt und instantiiert alle Items, um sie dann abzulaufen. Das ist extrem ineffizient.
Die folgende Zeile macht's besser, aber geht das nicht einfacher? Übersehe ich das offensichtliche?

Code: Alles auswählen

if container.items.filter(id=item.id).count() > 0: ...
Stefan

Verfasst: Mittwoch 6. August 2008, 11:45
von .robert
item.id und container.id sind doch bekannt, oder?
Warum nicht einfach

Code: Alles auswählen

if item.objects.get(id=itemid).containers.filter(id__exact=containerid).count() > 0: ...
(ungetestet)

Verfasst: Mittwoch 6. August 2008, 12:40
von sma
@.robert Einfach? Dein Ausdruck ist ja noch länger als meiner :) Und beide haben den Nachteil, dass sie das gesamte Objekt unnötigerweise laden. Dies kann man, wie ich inzwischen recherchiert habe, mit einem weiteren .values('id') vermeiden, dennoch finde ich die Existenzprüfung so wichtig, dass ich mir da eigentlich im QuerySet-Objekt eine fertige Methode für gewünscht hätte. Python kennt ja den `in`-Operator. Warum wurde da nicht einfach `__contains__` entsprechend implementiert? Vielleicht mache ich dafür mal einen Patch...

Stefan

Verfasst: Donnerstag 7. August 2008, 07:42
von jens
Stell mal die Frage auf der django Mailingliste.