2017-10-19 1 views
1

Ich bin ziemlich neu in Python/Django und ich habe das folgende Problem. Ich habe meine Modelle wie folgt strukturiert:Wie kann ich auf ein Modell zugreifen, das später für eine Berechnung in Django instanziiert wird?

class Foo: 
    name = models.CharField(max_length=10) 

class Bar: 
    othername = models.CharField(max_length=10) 
    othername2 = models.CharField(max_length=10) 
    fkey = models.ForeignKey(Foo, on_delete:models.CASCADE) 

class FooBaroo: 
    FooBarooInt = models.IntegerField() 
    Barkey = models.ForeignKey(Bar, on_delete:models.CASCADE) 

Die Beziehungen sind, dass 1 Foo mehrere Bars hat und 1 Bar hat mehrere FooBaroos. Ich möchte eine Tabelle mit Django erstellen, in der ich einen vollständigen Überblick über eine Bar-Klasse habe. Eines der Dinge, die ich anzeigen möchte, ist die Summe aller FooBarooInts eines Balkens. Wenn ich jedoch eine Eigenschaft zu Bar hinzufüge, die alle relevanten FooBaroo-Objekte übernimmt (durch objects.all(). Filter()), gibt es in den meisten Fällen nichts zurück, aber nicht alle (was ich seltsam finde).

Hat jemand eine Idee, wie ich das lösen soll?

+1

Sie benötigen keine Eigenschaft, Django stellt sie bereits über die umgekehrte Relation zur Verfügung: 'my_bar.foobaroo_set.all()'. –

+0

Hat mir geholfen. Vielen Dank! – Don

Antwort

1

Nutzen Sie die related_name und aggregation:

from django.db.models import Sum 
class Bar: 
    @property 
    def fb_int_sum(self): 
     return self.foobaroo_set.aggregate(s=Sum('FooBarooInt')).get('s') or 0 
     # return FooBaroo.objects.filter(Barkey=self).agg... 
+0

Das ist, was ich gesucht habe. Vielen Dank :) – Don

0
query = FooBaroo.objects.filter(Barkey={some_id}).all() # List all values 
query_sum = FooBaroo.objects.filter(Barkey={some_id})..aggregate(Sum('Barkey')) # Query to sum 
0

Ich glaube, Sie diese verwenden können:

obj.foobaroo_set.values_list ('FooBarooInts')

In der obigen "obj" ist ein benutzerdefinierter Balken, den Sie mit FooBarooInts zusammenfassen möchten. Beachten Sie, dass foobaroo_set in Kleinbuchstaben geschrieben werden muss (auch wenn Ihr Modellname dies nicht ist).

Sie können mehr Details sehen here und here.

Verwandte Themen