Django模型自身不算作实例吗?

时间:2019-09-20 00:23:42

标签: python django

我正在尝试解决ValueError: Cannot query "X": Must be "Y" instance.问题。问题是,我的X肯定是一个Y实例。在我的情况下,Xself模型中的UserAccount。以下是一些代码段:

from other.thing import do_something

class UserAccount(...):  # eventually subclasses from Django's user model
    @property
    def is_weekly_email_enabled(self):
        # import pdb; pdb.set_trace()  # Debugging entrypoint
        return do_something(self)

class UserPreference(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)  # This points to UserAccount
    name = models.CharField(max_length=255)

# In other/thing.py :
def do_something(user):
    return UserPreference.objects.get(user=user, name="some_preference")

我在pdb中设置了一个is_weekly_email_enabled()断点来确认。 测试输出的实际异常:

ValueError: Cannot query "user1": Must be "UserAccount" instance.
(Pdb) self
<UserAccount: user1>
(Pdb) type(self)
<class 'accounts.models.UserAccount'>
(Pdb) isinstance(self, UserAccount)
True

这是怎么回事?

2 个答案:

答案 0 :(得分:0)

尝试将return do_something(self)更改为return do_something(self.user)

答案 1 :(得分:0)

事实证明,我使用模型和实用程序功能的方式没有错。我有一个循环依赖性(我的models.py正在导入do_something,带有do_something的文件正在导入模型),但由于开发过程的原因,尚不清楚 >:

我在使用Django Shell和importlib重新导入模块时,对它们进行了一些小调整。重新启动外壳程序并从头开始重试所有内容时,情况更加清晰了。我求助于将模型导入实用程序功能本身,而不是导入文件中。