Wie zu verwenden Unterabfrage in django?

Möchte ich, um eine Liste der neuesten Kauf eines jeden Kunden, die nach dem Datum sortiert.

Folgende Abfrage macht, was ich will, außer das Datum:

(Purchase.objects
         .all()
         .distinct('customer')
         .order_by('customer', '-date'))

Erzeugt es eine Abfrage wie:

SELECT DISTINCT ON 
    "shop_purchase.customer_id" 
    "shop_purchase.id" 
    "shop_purchase.date" 
FROM "shop_purchase" 
ORDER BY "shop_purchase.customer_id" ASC, 
         "shop_purchase.date" DESC;

Bin ich gezwungen, zu verwenden customer_id als die ersten ORDER BY Ausdruck, weil der DISTINCT ON.

Möchte ich Sortieren nach dem Datum, also was die Abfrage, die ich wirklich brauchen sollte wie folgt Aussehen:

SELECT * FROM (
  SELECT DISTINCT ON 
      "shop_purchase.customer_id" 
      "shop_purchase.id" 
      "shop_purchase.date" 
  FROM "shop_purchase" 
  ORDER BY "shop_purchase.customer_id" ASC, 
           "shop_purchase.date" DESC;
  )
AS result 
ORDER BY date DESC;

Ich nicht Sortieren möchten mit python, weil ich immer noch auf Seite beschränken Sie die Abfrage. Es können zig-Tausende von Zeilen in der Datenbank.

In der Tat ist es derzeit sortiert in python nun und führt zu sehr langen Ladezeiten, so dass ist, warum ich bin versucht, dies zu beheben.

Grundsätzlich will ich so etwas https://stackoverflow.com/a/9796104/242969. Ist es möglich, express es mit django querysets statt raw SQL?

Die aktuellen Modelle und Methoden sind mehrere Seiten lang, aber hier ist eine Reihe von Modellen erforderlich, für den queryset oben.

class Customer(models.Model):
  user = models.OneToOneField(User)

class Purchase(models.Model):
  customer = models.ForeignKey(Customer)
  date = models.DateField(auto_now_add=True)
  item = models.CharField(max_length=255)

Wenn ich Daten wie:

Customer A - 
    Purchase(item=Chair, date=January), 
    Purchase(item=Table, date=February)
Customer B - 
    Purchase(item=Speakers, date=January), 
    Purchase(item=Monitor,  date=May)
Customer C - 
    Purchase(item=Laptop,  date=March), 
    Purchase(item=Printer, date=April)

Ich möchte in der Lage sein, zu extrahieren, die folgenden:

Purchase(item=Monitor, date=May)
Purchase(item=Printer, date=April)
Purchase(item=Table,   date=February)

Gibt es höchstens einen Kauf in der Liste pro Kunde. Der Kauf ist jeder Kunde das neueste. Es ist sortiert nach dem aktuellen Datum.

Dieser Abfrage werden in der Lage zu extrahieren, die:

SELECT * FROM (
  SELECT DISTINCT ON 
    "shop_purchase.customer_id" 
    "shop_purchase.id" 
    "shop_purchase.date" 
  FROM "shop_purchase" 
  ORDER BY "shop_purchase.customer_id" ASC, 
           "shop_purchase.date" DESC;
) 
AS result 
ORDER BY date DESC;

Ich versuche einen Weg zu finden, nicht zu haben, um mit raw-SQL um dieses Ergebnis zu erreichen.

  • Nicht diese Abfrage gibt Ihnen, was erforderlich ist Purchase.objects.order_by('-date').distinct('customer') ?
  • Ich kann nicht 🙁 DatabaseError: SELECT DISTINCT ON expressions must match initial ORDER BY expressions. customer_id muss die erste ORDER BY Ausdruck. stackoverflow.com/questions/9795660/...
  • Raw-SQL? Die Django ORM nervt^H^H^H^H^Seiner nicht sehr flexibel.
  • Können Sie erklären, welche Ergebnisse Sie möchten, dass Ihre Abfrage zurückgeben? Außerdem können Sie nach Ihrem Modell-Klassen?
  • user27478: ich habe beispielsweise Daten möchte ich kehrte minimal-model-Klasse. Paulo Scardine: Es zeigt, dass die Fehlermeldung auch, wenn Sie ausschließlich verwenden Djangos ORM. Purchase.objects.all().distinct('customer').order_by('-date') Diese queryset tun würde.
  • Sie waren in der Lage, dies zu lösen, mit Django ORM? Wenn ja, bitte teilen Sie Ihre Lösung.
  • Es ist eine long-standing akzeptiert neue feature Tickets: code.djangoproject.com/ticket/24218

InformationsquelleAutor Eric | 2013-01-15
Schreibe einen Kommentar