Filter UND pk gleichzeitig?

Django, Flask, Bottle, WSGI, CGI…
Antworten
SnakeBite
User
Beiträge: 46
Registriert: Mittwoch 4. März 2009, 18:26

Hallo.

Ich habe in den Django Docs gerade das hier gesehen und ich glaube ich sitz auf der Leitung:

Code: Alles auswählen

queryset = Book.objects.filter(title__startswith='M')
get_object_or_404(queryset, pk=1)
Quelle: https://docs.djangoproject.com/en/1.9/t ... shortcuts/

Ich verstehe es so:
Man filtert nach allen Büchern, deren Titel mit "M" beginnen und holt aber gleichzeitig das Buch mit pk=1 raus. Das macht doch irgendwie keinen Sinn. ENTWEDER ich will alle Bücher, die mit "M" beginnen ODER ich will ein ganz spezielles und nehm dann den pk dafür. Das Buch welches pk=1 entspricht muss ja nicht unbedingt auch mit "M" beginnen.

Wo ist mein Denkfehler?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Da passiert nichts gleichzeitig. Es wird zuerst gefiltert und dann aus den übrig gebliebenen Büchern nimmt man das Buch mit pk=1. Wenn ein Buch mit pk=1 existiert, dessen Name aber nicht mit M beginnt, wird eine Exception geworfen.

Ein vielleicht besseres Beispiel: Du hast veröffentlichte und unveröffentlichte Bücher. Du suchst nach einem bestimmten Buch, möchtest aber natürlich keine Informationen über unveröffentlicht Bücher zurückgeben (zumindest nicht an jeden), filterst diese also raus.
BlackJack

@SnakeBite: Der Denkfehler ist wahrscheinlich anzunehmen das Beispiele in Dokumentationen zwingend Sinn ergeben müssen. ;-) Kannst ja einen Bugreport bei Django dafür aufmachen. :-)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Ob das Beispiel Sinn macht oder nicht spielt noch nichtmal so eine große Rolle. Die Beispiele sollten möglichst jeden verständlich sein. Das Beispiel ist fraglich und auf die Motivation für das Feature wird überhaupt nicht eingegangen.
SnakeBite
User
Beiträge: 46
Registriert: Mittwoch 4. März 2009, 18:26

Im oben genannten Beispiel filtert man nach "M" und nimmt dann mit pk=1 halt den ersten Eintrag der gefilterten Liste raus?

Das ist dann natürlich klar.

Ich bin davon ausgegangen, dass pk=X direkt an einen ganz bestimmten Eintrag in der Tabelle "Books" gekoppelt ist. Also in etwa so:

PK Titel
======
1 A-Buch
2 M-Buch
3 S-Buch
4 M-Buch2

Sprich pk=1 wäre dann ausnahmslos immer "A-Buch"

Aber laut Beispiel in der Doku ist es wohl eher so:
Gefiltert nach "M" wäre es dann also nicht

2 M-Buch
4 M-Buch2

sondern

1 M-Buch
2 M-Buch2

Sehe ich das richtig?
BlackJack

@SnakeBite: Nein, das siehst Du nicht richtig. Deine erste Interpretation war besser. Es werden alle Bücher mit M gefiltert und dann wird davon das mit pk=1 genommen. Sofern das dabei ist. Bei Deinen Beispieldaten würde eine 404 Seite kommen, denn da hat ja das Buch mit einem A den pk 1.

@DasIch: Das spielt insofern eine Rolle als das Menschen sehr oft versuchen Sinn in Dingen zu sehen in denen keiner steckt. Und dann kommt es genau zu solchen Verwirrungen wie wir sie hier gerade haben. :-) Beispiele die nicht nur syntaktisch richtig sind und die API korrekt bedienen, sondern auch Sinn ergeben wenn man über die Bedeutung des Beispiels nachdenkt, sind definitiv besser.
SnakeBite
User
Beiträge: 46
Registriert: Mittwoch 4. März 2009, 18:26

BlackJack: Ahhh OK. Dann hab ich es doch richtig verstanden und nur das Beispiel war komisch gewählt. Es hätte mich schon sehr sehr gewundert wenn der pk auf einmal nicht mehr eindeutig wäre.

Top, Danke für die Hilfe.

Und sorry, dass ich solche Extrem-Anfänger-Fragen poste. Aber manchmal überarbeitet sich mein Hirn einfach an solchen Logik-Dingen.
Antworten