【问题标题】:django user profile database problemdjango用户配置文件数据库问题
【发布时间】:2011-07-13 02:15:44
【问题描述】:

我有一个名为 aaa 的应用程序,并且在 aaa 的 models.py 中我有类似的东西:

from django.db import models
from django.contrib.auth.models import User

class BBB(models.Model):
    user = models.OneToOneField(User)
    newsletter=models.BooleanField(default=False)

我添加到我的 setting.py

AUTH_PROFILE_MODULE = 'aaa.BBB'

然后我去 django shell 并输入

>>> from django.contrib.auth.models import User
>>> a=User.objects.get(id=1)
>>> a.get_profile()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python2.6/dist-packages/Django-1.2.5-py2.6.egg/django/contrib/auth/models.py", line 373, in get_profile
    self._profile_cache = model._default_manager.using(self._state.db).get(user__id__exact=self.id)
  File "/usr/local/lib/python2.6/dist-packages/Django-1.2.5-py2.6.egg/django/db/models/query.py", line 347, in get
    % self.model._meta.object_name)
DoesNotExist: BBB matching query does not exist.

有些人知道出了什么问题? 编辑:我做 manage.py syncdb

【问题讨论】:

    标签: django django-authentication


    【解决方案1】:

    没关系,一切正常。 DoesNotExist: BBB matching query does not exist. 表示没有此用户的 BBB(用户配置文件)(匹配查询,即获取此用户的用户配置文件)

    使用DoesNotExist 异常来断言特定用户是否具有关联的用户配置文件。当您创建与用户a 相关的BBB 实例时,您不会得到DoesNotExist 异常。

    【讨论】:

      【解决方案2】:

      http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

      get_profile() 方法没有 创建配置文件,如果没有 存在。您需要注册一个处理程序 对于信号 django.db.models.signals.post_save on 用户模型,并且在处理程序中, 如果 created=True,则创建关联的 用户个人资料。

      他们提到的信号在他们提供代码示例的地方并没有真正记录 django 风格,所以我将为您创建一个示例:

      from django.db.models import signals
      from django.contrib.auth.models import User
      
      def create_userprofile(sender, **kwargs):
          created = kwargs['created'] # object created or just saved?
      
          if created:
              BBB.objects.create(user=kwargs['instance'])  # instance is the user
              # create a BBB "profile" for your user upon creation.
              # now every time a user is created, a BBB profile will exist too.
              # user.BBB or user.get_profile() will always return something
      
      signals.post_save.connect(create_userprofile, sender=User)
      

      【讨论】:

      • 非常感谢您的帮助。我还有一个问题,我应该把这段代码放在我尝试调用 user.get_profile() 的 views.py 中?
      • 将它放在 BBB 模型的下方,因为信号处理程序会立即关注它。如果您的models.py 模块过于拥挤,或者您希望将应用程序组件分开,您可以将其放在同一个应用程序中的signals.py 模块中(某种潜规则)。
      猜你喜欢
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      • 1970-01-01
      • 2014-11-14
      • 2023-03-29
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多