Django ORM: Brauche sowas wie SQL 'case'...

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hab so ein model (vereinfacht):

Code: Alles auswählen

class PageMeta():
    ...
    pagetree = models.ForeignKey(PageTree)
    language = models.CharField()
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:

Code: Alles auswählen

queryset = PageMeta.objects.all().filter(pagetree=XY)
queryset = queryset.filter(language="de").fill_missing(language="en")
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:

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")
Primär Sprache ist "de", fallback Sprache ist "en", dann hätte ich gern, als Ergebnis:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Also an Deinem SQL-Beispiel sieht man doch recht schön, dass Dein gewünschtes Ergebnis so gar nicht berechenbar / generierbar ist! Dir fehlt eine Art "ID" für eine Seite - nicht die konkrete, sondern eine ID für den Platzhalter einer Seite, die eben durch konkrete Ausprägungen gefüllt werden kann. Nur über einen gemeinsamen Schlüssel kannst Du dann die zusammenghörigen Seiten identifizieren und entsprechend einer def. Reihenfolge auswählen.

Zusammengefasst fehlt Dir also eine Relation (hier mal grob als ERD):

Code: Alles auswählen

Seite --(1, 1)-- <gehört_zu> --(1, *)-- Seitengruppe
Je nach Auffassung könnte es auch zu einer n:m Relation werden.

Wie man das nun im Django-ORM abbildet kann ich Dir nicht sagen, aber vermutlich dürfte diese Ergänzung auch zur Lösung führen.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Es deutet ehr darauf hin, das mein vereinfachtes Beipiel schlecht war ;)

Ich hab mittlerweile den zu Fuss weg fertig: http://trac.pylucid.net/changeset/2442

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten