2010-01-26 2 views
1

J'ai une relation plusieurs à plusieurs dans Django même que celle-ci:Quel est le meilleur moyen d'obtenir une numérisation efficace de plusieurs à plusieurs avec les modèles Django?

class Account (models.Model): 
    name = models.CharField(max_length = 30) 
    user = models.ForeignKey(User, null = True, blank = True) 

class Publisher (models.Model): 
    publisherID = models.BigIntegerField() 
    name = models.CharField(max_length = 30) 
    lastRequestedId = models.BigIntegerField() 

class Subscription (models.Model): 
    user = models.ForeignKey(Account) 
    twitterPublisher = models.ForeignKey(Publisher) 

Une liste des publisherIDs pour un compte est une liste d'abonnement. De temps en temps, je voudrais analyser les abonnements de chaque compte avec une telle liste d'ID publisher et mettre à jour les abonnements, ajouter de nouveaux abonnements pour les ID d'éditeur introuvables dans les abonnements accont et supprimer les abonnements non trouvés dans la liste des comptes publisherID. Cette liste est obtenue ailleurs.

Quelle est la meilleure façon de faire cela? Subscription.objects.all() et puis boucle à travers chacun (pourrait être beaucoup!) Et garder une trace des abonnements et des utilisateurs, éventuellement mise à jour une fois que je comprends l'état actuel de la base de données par rapport aux nouvelles informations? Ou est-ce que je fais une boucle sur les comptes et utilise filter() sur l'objet Subscription? Est-ce que cela conduira à beaucoup de requêtes mysql?

La liste des publisherIDs Je me ressemble à ceci:

[15446531, 15503880, 4909151, 105263800, 21457289, 14293310, 807095, 14511951, 
0, 20214495, 15234407, 5988062, 16120265, 50393960, 33933259, 10059852, 652193, 
88992966, 43166813, 65682198, 14581921, 12044602, 752673, 14414230, 18994120, 17180567, 
17633960, 1468401, 71876190, 23969777, 63490206, 2425151, 14456474, 18396070, 62205298, 
11348282, 62581962, 15234886, 30313925, 15166438, 17525171, 15007149, 10760422, 22677790, 
14874480, 22093112, 24741685, 10454572, 19015586, 14572071, 37492156, 6253282, 37996645, 
18725061, 15983724, 8294212, 24431892, 14589771, 773287, 20772763, 22636391, 816653, 
19394188, 49793, 1688, 15813140, 20536157, 202003, 685513, 1000591, 17220934, 972651, 
5668942, 1692901, 15913] 

CLARIFICATION DE: J'ai une liste des ids par compte. Je souhaite également supprimer les abonnements si l'utilisateur a un abonnement s'il ne figure pas dans la liste des publisherids de cet utilisateur.

+0

Je serais ravi d'obtenir des informations sur ce problème. Quelque chose ne va pas avec la question? –

Répondre

1

Tout d'abord, pour des raisons pratiques, je voudrais ajouter le champ M2M d'un django avec intermediary table ou sans elle, dépend de si vous avez besoin d'avoir des données supplémentaires sur abonnement:

class Account (models.Model): 
    name = models.CharField(max_length = 30) 
    user = models.ForeignKey(User, null = True, blank = True) 
    publishers = models.ManyToManyField(Publisher, through='Subscription') 

Ensuite, vous pouvez utiliser le filtre à exclure les comptes qui ont tous les publisherIDs

Account.objects.exclude(publishers__publisherID__in=[1,2]) 

En fin de compte tout ce que vous devez faire est de joindre les nouveaux éditeurs aux comptes filtrés.

+0

Eh bien, je suis désolé si n'était pas assez précis, mais j'ai une liste d'ID par compte. Je souhaite également supprimer les abonnements si l'utilisateur a un abonnement s'il ne figure pas dans la liste des publisherids de cet utilisateur. –

0

dmishe m'a mis dans la bonne direction, mais peut-être ce que je dois faire est ce qui se fait dans cette réponse:

Querying django ManyToMany

Publication.objects.filter(subscription__group=account_instance) 

Peut-être?

Questions connexes