Seite 1 von 1
Filter UND pk gleichzeitig?
Verfasst: Mittwoch 22. Juni 2016, 20:23
von SnakeBite
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?
Re: Filter UND pk gleichzeitig?
Verfasst: Mittwoch 22. Juni 2016, 20:48
von DasIch
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.
Re: Filter UND pk gleichzeitig?
Verfasst: Mittwoch 22. Juni 2016, 20:50
von 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.

Re: Filter UND pk gleichzeitig?
Verfasst: Mittwoch 22. Juni 2016, 21:01
von DasIch
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.
Re: Filter UND pk gleichzeitig?
Verfasst: Mittwoch 22. Juni 2016, 21:23
von SnakeBite
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?
Re: Filter UND pk gleichzeitig?
Verfasst: Mittwoch 22. Juni 2016, 21:35
von 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.
Re: Filter UND pk gleichzeitig?
Verfasst: Donnerstag 23. Juni 2016, 00:24
von SnakeBite
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.