Lasst uns sagen, dass ich ein einfaches Warenkorb-System mit diesen Modellen haben:Beschriften Summe, während immer noch Zugriff auf Fremdkörper mit
from django.db import models
from django.utils import timezone
class Product(models.Model):
name = models.CharField(max_length=255)
# More fields...
@property
def featured_image(self):
try:
return self.productimage_set.all()[0]
except IndexError:
return None
def __str__(self):
return self.name
class ProductImage(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE)
image = models.FileField(upload_to='products/')
# More fields...
def __str__(self):
return self.product.name
class Order(models.Model):
created = models.DateTimeField(default=timezone.now)
# More fields...
def __str__(self):
return str(self.pk)
class OrderItem(models.Model):
order = models.ForeignKey(Order, on_delete=models.CASCADE)
product = models.ForeignKey(Product, on_delete=models.CASCADE)
quantity = models.PositiveIntegerField()
# More fields...
def __str__(self):
return 'Order %s: %s of %s' % (
self.order_id,
self.quantity,
self.product.name,
)
Wenn ein Benutzer einen Auftrag erteilt, ein OrderItem
Objekt für jedes Produkt erzeugt wird, sie bestellt , die mich wissen lassen, (1) welches Produkt sie gekauft haben und (2) wie viele von diesem Produkt sie gekauft haben.
Angenommen, ich wollte dem Benutzer zeigen, welche Produkte er am meisten bestellt hat. Ich werde diese Daten als Beispiel:
Order 1:
Product A: 10
Order 2:
Product A: 10
Product B: 5
Order 3:
Product A: 10
Product B: 5
Product C: 5
Diese besondere Anwender sollten die Produkte in dieser Reihenfolge angezeigt:
Product A: 30 total
Product B: 10 total
Product C: 5 total
Dies ist der Code, der diese erreicht:
order_items_by_quantity = OrderItem.objects.values(
'product__name',
).annotate(
total_purchased=Sum('quantity'),
).order_by(
'-total_purchased',
)
for order_item in order_items_by_quantity:
print(order_item)
Aber mit diesem Ansatz kann ich order_item.product.featured_image
nicht verwenden. Gibt es eine Möglichkeit, beides zu haben? Nämlich die Mengen alle summiert und bestellt von den meisten bis mindestens und die Fähigkeit, order_item.product.featured_image
zu verwenden.