Seite 1 von 1

django : per string auf Klasse zugreifen

Verfasst: Sonntag 6. Juli 2008, 18:35
von d3f3nd3r
halle,

ich fürchte der Titel ist schlecht gewählt aber mein Problem schaut wie folgt aus:

ich würde gerne über einen String eine Klasse auswählen, auf die ich dann "objects.filter(id="foo") anwende (Objekte aus der DB holen).

Konkret heißt das, ich habe 2 Klassen (Tabellen) Location und Category.

jetzt würde ich gerne wie folgt zugreifen :


Code: Alles auswählen

def get_objects(class_name):
    return class_name.objects.all()

print get_objects('Category')
natürlich funktioniert das so nicht.
Ich würde aber prinzipiell so zugreifen, da ich sonst 2 Funktionen habe die so fast genau das selbe machen (dont repeat yourself).

Ein anderer Lösungsansatz wäre natürlich explizit SQL zu verwenden aber das ist nicht sehr elegant!

mfg

Verfasst: Sonntag 6. Juli 2008, 18:48
von audax
Lass dir doch Funktionen zur Laufzeit erstellen:

Code: Alles auswählen

def object_getter(class):
	def get_objects(c):
		return class.objects.all()
	return get_objects
get_categories = object_getter(Category)
get_foobar = object_getter(Foobar)

Re: django : per string auf Klasse zugreifen

Verfasst: Sonntag 6. Juli 2008, 20:32
von jens
d3f3nd3r hat geschrieben:ich würde gerne über einen String eine Klasse auswählen, auf die ich dann "objects.filter(id="foo") anwende (Objekte aus der DB holen).
Das müßte per getattr gehen, ungefähr so:

Code: Alles auswählen

from MyApp import models

def get_objects(class_name):
    model_class = getattr(models, class_name)
    return model_class.objects.all()

print get_objects('Category')
Generell sieht das für mich aber ehr komisch aus. Woher kommt der String? Einfacher wäre vielleicht eine IF Abfrage oder ein dict aufzubauen...
d3f3nd3r hat geschrieben:Ich würde aber prinzipiell so zugreifen, da ich sonst 2 Funktionen habe die so fast genau das selbe machen (dont repeat yourself).
Für die gemeinsamen Funktionen könntest du auch eine basis model Klasse erstellen oder einen gleichen Model Manager.
Wobei ich nicht weiß ob letzteres geht.

Verfasst: Sonntag 6. Juli 2008, 20:59
von audax
was mir grad auffällt:

Code: Alles auswählen

def object_getter(class):
	def get_objects():
		return class.objects.all()
	return get_objects
get_categories = object_getter(Category)
get_foobar = object_getter(Foobar)
Ist das gleiche wie:

Code: Alles auswählen

def object_getter(class):
	return class.objects.all
get_categories = object_getter(Category)
get_foobar = object_getter(Foobar)