Менеджер не доступен через экземпляры SocialToken

Что-то очень странное происходит с моим сценарием, я отлаживал весь день и ничего не получил. Я искал повсюду и ничего не решил мою проблему, название может вводить в заблуждение, но это ошибка, которую я получаю.

Я использую Django-Allauth, у меня есть SocialAccounts и SocialTokens

    socialaccounts = SocialAccount.objects.filter(provider='facebook')
    for SocialAccount in socialaccounts:
        socialtokens = SocialToken.objects.filter(id=SocialAccount.id)
        for SocialToken in socialtokens:
            #get a few values, set a few values
            #at the end update or create a custom model
            obj, created = FacebookPagesList.objects.update_or_create(user=P.user, Page_ID=P.Page_ID, uid=P.uid, defaults = updated_values)

Я отлаживал это несколько раз, он прекрасно работает, когда он запускается только один раз, т.е. я ограничиваю список SocialAccount пользовательским фильтром для одного пользователя, и он работает правильно, затем я делаю это для второго пользователя, и он тоже работает нормально. Пока 2 пользователя являются единственными в БД. Когда я удаляю пользовательский фильтр, он проходит через 1-го пользователя и заполняет модель, но не работает для 2-го пользователя.

ИДК, что еще попробовать. Вот моя модель.

class FacebookPagesList(models.Model):
user = models.ForeignKey(SocialAccount)
Page_ID = models.CharField('Page ID', max_length=255)
Page_Name = models.CharField('Page Name', max_length=255)
Page_Access_Token = models.TextField('Page Token')
Page_Category = models.CharField('Page Category', max_length=100)
uid = models.CharField('FB User ID',max_length=255)
Perms = models.TextField('Permissions')
getdata = models.BooleanField('Pull data?', default=True, null=False)
DateAdded = models.DateTimeField('Date Added', default=timezone.now)
DateModified = models.DateTimeField('Date Modified', default=timezone.now)
LastDataPull = models.DateTimeField('Last Data Pulled', default='1990-01-01 00:00:00')
#id = models.IntegerField('ID', default=0, primary_key=True)

def __str__(self):
    return self.Page_Name

class Meta:
    unique_together = ('user', 'Page_ID')

1 ответ

Решение

Ошибка, которую вы получаете, говорит вам совсем немного. "Менеджер" относится к Model.objects так что где-то вы пытаетесь получить доступ .objects на одном SocialToken,

Я думаю, что где-то в вашем коде у вас есть что-то вроде следующего:

SocialToken = SocialToken.objects.first()  # This isn't good!
...
tokens = SocialToken.objects.all()  # This will cause your error

Здесь, потому что SocialToken ссылается на экземпляр, а не на вашу модель, вы не сможете получить доступ SocialToken.objects Ваш менеджер.

Вы сделали это с SocialAccount в коде, который вы вставили выше. Используйте что-то вроде social_account скорее, чем SocialAccount для ссылки на индивидуальный аккаунт:

social_accounts = SocialAccount.objects.filter(provider='facebook')
for social_account in social_accounts:
    socialtokens = SocialToken.objects.filter(id=social_account.id)

Просмотрите свой код и посмотрите, есть ли у вас CapWords экземпляры и переименовать их, чтобы они separated_with_underscores, См. Руководство по стилю Python для получения дополнительной информации о соглашениях об именах классов / экземпляров / переменных (это хорошее чтение!).

Другие вопросы по тегам