2010-09-08 4 views
0

Donc j'ai un modèle avec la liste de tous les articles que j'ai. Et autre modèle qui a Foreign-Key à mon modèle principal ... Comment faire objet de jeu de requête. De tous les articles du premier modèle qui contiennent mon deuxième modèle?Comment faire QuerySet des éléments qui contiennent l'autre modèle

class Music(models.Model): 
    name=models.CharField() 
    duration=models.IntegerField() 


class Playlist(models.Model): 
    misic=models.ForeignKey(Music) 

Comment faire pour mettre ensemble de requête obj de la musique qui est dans la liste de lecture? Ensuite, je souhaite que .aggregate compte la durée de toutes les listes de lecture.

Répondre

1

Comment faire pour mettre ensemble de requête obj de la musique qui est dans la liste de lecture?

Quelque chose comme ça.

playlist = Playlist.objects.get(**conditions) 
music = Music.objects.filter(playlist = playlist) 

Alors iwant pour faire .aggregate compter la durée de toute playlist.

Utilisez une annotation Django avec la classe Sum (django.db.models).

from django.db.models import Sum 
qs = Music.objects.filter(playlist = playlist).annotate(total = 
    Sum('duration')) 

Mise à jour

(Après avoir lu @ commentaire de Pol)

modèle musique a attribue pas playlist ...

  1. Obtenez-vous une erreur? Si oui, postez le code que vous avez utilisé et empilez la trace. J'ai testé vos modèles localement et le filtre/annotation donné ci-dessus a bien fonctionné.
  2. Vos modèles n'ont aucun sens pour moi. Je m'attendrais à ce que les modèles Music et Playlist aient une relation de plusieurs à plusieurs. A défaut d'un Playlist devrait avoir beaucoup de Music instances associées. C'est à dire. Clé étrangère doit être à l'intérieur Music, pas autrement comme vous avez maintenant.

Update 2

(Après avoir lu @ commentaire de Pol)

Eh oui ... vous raison ... Il doit y avoir beaucoup à beaucoup .. mais ce n'est pas .. . Que devrais-je faire? Et la musique est déjà faite grande table dans la base de données. J'ai juste besoin d'ajouter le support des listes de lecture ....

Vous n'avez pas besoin de changer le modèle Music ou la table sous-jacente. Vous pouvez ajouter un nouveau modèle Playlist avec la structure suivante:

class Playlist(models.Model): 
    music = models.ManyToManyField(Music) 

Vous pouvez maintenant goutte la table de lecture existante et exécuter python manage.py syncdb. La nouvelle table pour Playlist et joindre des tables pour plusieurs à plusieurs sera créée.Cela dit, je dois ajouter un avertissement statutaire que ce n'est pas un bon moyen de gérer les changements apportés à vos modèles. Il vaudra beaucoup mieux utiliser un outil de migration tel que South. South vous permettra de gérer les migrations avec beaucoup plus de grâce, en particulier lorsque des changements de données sont nécessaires.

+0

Le modèle de musique n'a pas de liste de lecture d'attribut ... – Pol

+0

@Pol: mise à jour de ma réponse. Voir au dessus. –

+0

Oui ... Vous avez raison ... Il doit y en avoir beaucoup à beaucoup ... mais ce n'est pas ... Que dois-je faire? Et la musique est déjà faite grande table dans la base de données. J'ai juste besoin d'ajouter le soutien des listes de lecture .... – Pol

Questions connexes