Django ORM: Brauche sowas wie SQL 'case'...
Verfasst: Freitag 27. November 2009, 09:47
Hab so ein model (vereinfacht):
Nun möchte ich so eine Abfrage machen:
1. Gib mit alle Einträge, die pagetree==XY haben und in language=="de" sind
2. Wenn es "de" nicht gibt, dann in language=="en"
Also ungefähr so:
Aber sowas wie "fill_missing" gibt es IMHO nicht.
Ich mache das z.Z. zu Fuss. Also erst alles in einer Sprache holen. Dann nachsehen, welche Einträge fehlen und diese dann nachträglich holen...
Btw. wie würde das in SQL aussehen?
EDIT: Um es nochmal klarer zu machen:
Mal angenommen ich hab die Daten:
Primär Sprache ist "de", fallback Sprache ist "en", dann hätte ich gern, als Ergebnis:
Und toll wäre auch noch, wenn man eine drittes fallback hat, also Wenn eine Seite nur in "FR" vorkommt, wird diese zu Not genommen.
EDIT2: Wie ich im IRC erfahren hab, suche ich ein ersatz für den "case", siehe: http://www.sql-und-xml.de/server-daten/ ... /case.html
Code: Alles auswählen
class PageMeta():
...
pagetree = models.ForeignKey(PageTree)
language = models.CharField()
1. Gib mit alle Einträge, die pagetree==XY haben und in language=="de" sind
2. Wenn es "de" nicht gibt, dann in language=="en"
Also ungefähr so:
Code: Alles auswählen
queryset = PageMeta.objects.all().filter(pagetree=XY)
queryset = queryset.filter(language="de").fill_missing(language="en")
Ich mache das z.Z. zu Fuss. Also erst alles in einer Sprache holen. Dann nachsehen, welche Einträge fehlen und diese dann nachträglich holen...
Btw. wie würde das in SQL aussehen?
EDIT: Um es nochmal klarer zu machen:
Mal angenommen ich hab die Daten:
Code: Alles auswählen
PageMeta(name="erste Seite", pagetree="1", language="de")
PageMeta(name="dritte Seite", pagetree="1", language="de")
PageMeta(name="Page One", pagetree="1", language="en")
PageMeta(name="Page Two", pagetree="1", language="en")
PageMeta(name="Page 1 fr", pagetree="1", language="fr")
Code: Alles auswählen
PageMeta(name="erste Seite", pagetree="1", language="de")
PageMeta(name="Page Two", pagetree="1", language="en")
PageMeta(name="dritte Seite", pagetree="1", language="de")
EDIT2: Wie ich im IRC erfahren hab, suche ich ein ersatz für den "case", siehe: http://www.sql-und-xml.de/server-daten/ ... /case.html