Teil einer Funktion ist die Berechnung einer Anzahl der letzten gültigen Angebote, die niedriger, gleich und höher als a_price
sind. Ich kann keinen besseren Weg finden, also benutze ich jetzt zwei Loops. Das Problem ist, dass hier 575 Abfragen ausgeführt werden, was zu viel ist.Wie kann die Anzahl (575) von Abfragen in einer verschachtelten Schleife verringert werden?
Ein Produkt kann viele Käufer haben und Käufer hat viele Angebote (mit unterschiedlichen Datumsangaben). Ich habe versucht, prefetch_related('buyers')
hinzuzufügen, aber es hat überhaupt nicht geholfen.
EDIT: In diesem Fall gibt es 32 Produkte und jedes Produkt hat von 0 bis 30 Käufer.
reset_queries()
products = Product.objects.filter(user=user)
my_active_products = products.filter(active=True).prefetch_related('buyers')
for product in my_active_products:
for buyer in product.buyers.filter(valid=True):
last_valid_offer = buyer.get_last_valid_offer()
a_price = product.a_price
if a_price:
if a_price < last_valid_offer.eur_price:
cheaper += 1
elif a_price > last_valid_offer.eur_price:
more_expensive += 1
elif a_price == last_valid_offer.eur_price:
equal += 1
else:
unknown += 1
print len(connection.queries)
Wissen Sie, was ich tun soll, um die Anzahl der Abfragen zu verringern?
EDIT Models.py:
class Product(Model):
name...
active = BooleanField(...)
class Buyer(Model):
product = ForeignKey('Product',related_name='buyers')
def get_last_valid_offer(self):
return self.offers.filter(valid=True).latest('datetime')
class Offer(Model):
buyer = ForeignKey('Buyer', related_name='offers')
valid = BooleanField(...)
datetime = DateTimeField(...)
eur_price = MoneyField(...)
Danke. Mein Schema sieht ein bisschen anders aus. Ich habe ein sehr vereinfachtes Modell von models.py zum Ende der Frage hinzugefügt. Ich habe kein "last_offer" -Attribut in der Käufertabelle. Ich berechne es wie buyer.offers.latest ('datetime'). –
Hinzugefügt eine Django-Übersetzung der Abfrage, ich habe es nicht getestet, so dass es sicherlich irgendwo brechen wird: D Aber sein Wert ist mehr, um eine Vorstellung davon zu geben, welche Teile der Django-Dokumente zu betrachten. – qwattash