无法通过 SocialToken 实例访问管理器

Manager isn't accessible via SocialToken instances

我的脚本发生了一些非常奇怪的事情,我已经调试了一整天,但一无所获。我进行了广泛的搜索,但没有解决我的问题,标题可能具有误导性,但这就是我得到的错误。

我正在使用 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)

我已经调试了好几次,它只运行一次就工作正常,IE 我用一个用户的用户过滤器限制 SocialAccount 列表并且它工作正常,然后我为第二个用户做它并且它工作没关系。到目前为止,这 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')

你得到的错误告诉了你很多。 "Manager" 指的是 Model.objects,因此您在某处尝试访问单个 SocialToken.

上的 .objects

我猜你的代码中某处有如下内容:

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。有关 class/instance/variable 命名约定的更多信息,请参阅 the Python Style Guide(这是一本好书!)。