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

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
metty
User
Beiträge: 99
Registriert: Samstag 13. Dezember 2008, 19:30

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
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

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...
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Antworten