Как лучше всего добиться эффективного сканирования «многие ко многим» с моделями Django? - PullRequest
1 голос
/ 26 января 2010

У меня есть отношения многие ко многим в 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 )

Список идентификаторов издателя для учетной записи представляет собой список подписки. Время от времени я хотел бы просматривать подписки каждой учетной записи с таким списком идентификаторов publisher и обновлять подписки, добавляя новые подписки для идентификаторов publisher, которых нет в подписках accont, и удаляя подписки, которых нет в списке идентификаторов publisher идентификаторов. Этот список получен в другом месте.

Каков наилучший способ сделать это? Subscription.objects.all (), а затем перебирайте каждую (может быть много!) И отслеживайте подписки и пользователей, в конечном итоге обновляя, как только я понимаю текущее состояние базы данных и новую информацию? Или я делаю циклический просмотр учетных записей и использую filter () для объекта Subscription? Приведет ли это ко многим запросам mysql?

Список идентификаторов издателей, которые я получаю, выглядит следующим образом:

[15446531, 15503880, 4909151, 105263800, 21457289, 14293310, 807095, 14511951,
20032100, 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]

осветляющие : У меня есть список идентификаторов для учетной записи . Я также хочу удалить подписки, если у пользователя есть подписка, если ее нет в списке pubisherids для этого пользователя.

Ответы [ 2 ]

1 голос
/ 26 января 2010

Прежде всего, для удобства, я бы добавил поле M2M в django с промежуточной таблицей или без него, зависит от того, нужны ли вам дополнительные данные по подписке:

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

Затем вы можете использовать фильтр, чтобы исключить учетные записи, которые имеют все идентификаторы издателя

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

В конце концов, все, что вам нужно сделать, это присоединить новых издателей к отфильтрованным аккаунтам.

0 голосов
/ 27 января 2010

Дмише направил меня в правильном направлении, но, возможно, мне нужно сделать следующее:

Запрос django ManyToMany

Publication.objects.filter(subscription__group=account_instance)

Может быть?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...