2017-10-19 8 views
1

Je suis assez nouveau sur Python/Django et j'ai le problème suivant. J'ai structuré mes modèles comme suit:Comment puis-je accéder à un modèle qui est instancié plus tard pour un calcul dans Django?

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) 

Les relations sont que 1 Foo a plusieurs bars et 1 bar a plusieurs FooBaroos. Ce que je veux, c'est créer une table avec Django dans laquelle j'ai un aperçu complet d'une classe Bar. Une des choses que je veux afficher est la somme de tous les FooBarooInts d'une barre. Si j'ajoute cependant une propriété à Bar qui prend tous les objets FooBaroo pertinents (à travers objects.all(). Filter()) il finit par ne rien retourner dans la plupart des cas, mais pas tous (ce que je trouve bizarre).

Est-ce que quelqu'un a une idée de comment je devrais résoudre ceci?

+1

Vous n'avez pas besoin d'une propriété, Django vous le fournit déjà via la relation inverse: 'my_bar.foobaroo_set.all()'. –

+0

m'a aidé le long. Merci! – Don

Répondre

1

Faire usage du related_name et 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

C'est ce que je cherchais. Je vous remercie :) – 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

Je pense que vous pouvez utiliser ceci:

obj.foobaroo_set.values_list ('FooBarooInts')

Dans ce qui précède "obj" est une barre personnalisée que vous voulez ajouter à FooBarooInts. Notez que foobaroo_set doit être en minuscules (même le nom de votre modèle ne l'est pas). Vous pouvez voir plus de détails here et here.