Ich habe eine Liste von Person
s jeder, die mehrere Felder haben, die ich normalerweise filtern, was ist, mit der object_list generische Ansicht. Jede Person kann mehrere Comment
s haben, jeder mit einer Datetime und einer Textzeichenfolge. Was ich letztendlich tun möchte, ist die Möglichkeit, Kommentare basierend auf Daten zu filtern.django Join-like Erweiterung von queryset
class Person(models.Model):
name = models.CharField("Name", max_length=30)
## has ~30 other fields, usually filtered on as well
class Comment(models.Model):
date = models.DateTimeField()
person = models.ForeignKey(Person)
comment = models.TextField("Comment Text", max_length=1023)
Was ich tun möchte, ist ein queryset erhalten wie
Person.objects.filter(comment__date__gt=date(2011,1,1)).order_by('comment__date')
dass queryset senden Object_List und in der Lage sein, nur um die Kommentare nach Datum geordnet zu sehen nur so viele Objekte auf einer Seite.
ZB wenn "Person A" Kommentare hat 12.12.2010, 1/2/2011, 05.01.2011, "Person B" hat keine Kommentare und Person C hat einen Kommentar auf 1/3/2010 würde ich sehe:
"Person A", 1/2 - comment
"Person C", 1/3 - comment
"Person A", 1/5 - comment
ich stark würde es vorziehen, zu wechseln, nicht zu haben auf Comments.objects.filter()
basierte Filterung, denn das würde ich weitgehend große Teile des Codes in den beide der Ansicht und Vorlage wiederholen machen.
Wenn ich jetzt den folgenden Befehl ausprobiere, erhalte ich ein Anfrage-Set (PersonA, PersonC, PersonA), aber wenn ich versuche, das in einer Vorlage zu rendern, dann enthält jede Person comment_set alle ihre Kommentare, auch wenn sie nicht ' t im Datumsbereich.
Idealerweise würde es eine Art von Funktionalität geben, wo ich eine Person
Anfrageeinheit comment_set
zu einem größeren Abfrage-Set erweitern könnte, das basierend auf dem Kommentar sortiert und sortiert und in eine generische object_list-Ansicht eingefügt werden kann. Das ist normalerweise in SQL mit einem JOIN ziemlich einfach zu tun, aber ich möchte das ORM nicht verlassen, das ich überall sonst verwende.
OK, meine Lösung war im Grunde nur Comments.Objects.Filter(); Teilen Sie die Vorlage in eine separate Datei, die in der entsprechenden Weise enthalten ist, wenden Sie einen zusätzlichen Kontext boolean an (wenn comment_date_filter, wenden Sie eine geeignete Präfix-Zeichenfolge vor allen Personenverweisen in der Ansicht an):
{% if comment_date_filter %}
{% for obj in object_list %}
{% with obj.person as p %}
{% include "object_list_row.html" %}
{% endwith %}
{% endfor %}
{% else %}
{% for obj in object_list %}
{% with obj as p %}
{% include "object_list_row.html" %}
{% endwith %}
{% endfor %}
{% endif %}
Es ist meist nur die Menge verdoppeln Code in der Ansicht und der Vorlage und versuchen, die Dinge trocken zu halten, und erwarten, dass es eine einfache Lösung, die ich gerade übersehen, so dass ich den Beitritt zu implementieren. Django lässt mich die Ärzte anhand von Kommentardaten (mit Wiederholungen) bestellen, lässt mich aber nicht die Kommentare sehen, auf denen die Sortierung basiert? Das erscheint mir seltsam. Der Grund, warum ich nicht aus Kommentar filtern möchte, ist, dass meine Vorlage und meine Ansicht beide ein Paar 100 Zeilen sind und ausgefallene Dinge tun, die ich nicht auf zwei verschiedene Arten implementieren muss. –
Ich glaube, dass die ursprüngliche Abfrage ausgeschaltet ist, 'Person.objects.filter (comment__date__gt = date (2011,1,1)). Order_by ('comment__date')' Wenn mein Verständnis auf der SQL ist dies wird, wird Basic generieren Das wird Leute nach ihrem ersten Kommentar bestellen. Was ist anders an comment_date_filter und nicht comment_date_filter.Warum unterscheidet sich das Filtern von nicht von der Filterung? Was ich meine, ist, warum nicht einfach dies in der Ansicht tun: 'wenn gefiltert: objects = Comments.filter (...). Order_by (...) else: objects = Comments.order_by (...) ' – milkypostman
Werfen Sie auch einen Blick auf http://docs.djangoproject.com/en/1.2/ref/models/querysets/#values – milkypostman