Filtro con il campo ha rapporto a Django?
-
22-09-2019 - |
Domanda
Non ho questi modelli in Django:
class Customer(models.Model):
def __unicode__(self):
return self.name
name = models.CharField(max_length=200)
class Sale(models.Model):
def __unicode__(self):
return "Sale %s (%i)" % (self.type, self.id)
customer = models.ForeignKey(Customer)
total = models.DecimalField(max_digits=15, decimal_places=3)
notes = models.TextField(blank=True, null=True)
class Unitary_Sale(models.Model):
book = models.ForeignKey(Book)
quantity = models.IntegerField()
unit_price = models.DecimalField(max_digits=15, decimal_places=3)
sale = models.ForeignKey(Sale)
Come faccio a filtrare per ottenere tutti i libri che il cliente vendita?
ho provato:
units=Unitary_Sale.objects.all()
>>> units=Unitary_Sale.objects.all()
>>> for unit in units:
... print unit.sale.customer
... print unit.book,unit.sale.total
...
Sok nara
Khmer Empire (H001) 38.4
Sok nara
killing field (H001) 16
San ta
khmer krom (H001) 20
San ta
Khmer Empire (H001) 20
>>>
quello che voglio:
sok nora:56.4 (38.4+18)
san ta:40 (20+20)
O Dizionario:
{sok nora:156.4, san ta:40}
>>> store_resulte = {}
>>> for unit in units:
... store_resulte[unit.sale.customer] = unit.sale.total
...
>>> print store_resulte
{<Customer: Sok nara>: Decimal("16"), <Customer: san ta>: Decimal("20")}
Dovrebbe essere:
{<Customer: Sok nara>: Decimal("56.4"), <Customer: san ta>: Decimal("40")}
Soluzione
Dai un'occhiata alla aggregazione documentazione .
Credo che questo dovrebbe fare il trucco (solo con la versione 1.1 o dev.):
Customer.objects.annotate(total=Sum('sale__total'))
Modifica : È inoltre possibile definire un metodo personalizzato per la classe:
class Customer(models.Model):
def __unicode__(self):
return self.name
name = models.CharField(max_length=200)
def total_sale(self):
total = 0
for s in self.sale_set:
total += s.total
return total
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow