Seite 1 von 1

(django) models.Manager Konstruktor verändern/überschreiben

Verfasst: Freitag 20. Februar 2009, 11:39
von metty
Hallo zusammen,

ich kämpfe gerade mit dem Problem den Konstruktor einer von "models.Manager" abgeleiteten Klasse zu verändern...

Folgender Hintergrund, ich habe in der Manager-Klasse 2 Methoden, die jedoch beide auf die selben Daten zugreifen. Um die Datenbankabfrage nur einmal ausführen zu lassen, habe ich mir gedacht, dass ich den Datenbank-Query einmal im Konstruktor ausführen lasse, um dann mit den Methoden darauf zuzugreifen.

Hier mal mein Code:

Code: Alles auswählen

class MyManager(models.Manager):
	def __init__(self):
		super(MyManager, self).__init__()
		self.query = super(MyManager, self).get_query_set()

Ich jedoch wird ein Fehler geworfen, wenn ich in einer Methode auf "self.query" zugreifen will.

Code: Alles auswählen

AttributeError: 'NoneType' object has no attribute '_meta'

Hat hier jemand einen Denkanstoß für mich?

Vielen Dank.


Freundliche Grüße

Verfasst: Freitag 20. Februar 2009, 17:29
von apollo13
Der Manager weiß im __init__ noch nicht an welches Model er gebunden ist, hence NoneType. Schau dir mal django/db/models/manager.py an, dann ist dir klar warum das so nicht geht, das model wird erst in contribute_to_class gesetzt, erst dann funktionieren die Query Methoden...

Verfasst: Samstag 21. Februar 2009, 11:14
von sma
Abgesehen davon, löst ein `get_query_set()` doch noch gar keine Abfrage aus. Erst wenn man auf die Daten wirklich zugreift, wird die Abfrage gestartet.

Stefan