django : per string auf Klasse zugreifen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
d3f3nd3r
User
Beiträge: 40
Registriert: Montag 19. November 2007, 20:17

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
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

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)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

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)
Antworten