Django一对一反向关系不存在。

4

我在这里遇到了一个奇怪的问题,我的一对一关系似乎在反向上不起作用。代码最容易解释清楚。

我扩展了默认的Django用户以添加时区,如下所示:

#This model holds custom user fields
class TaskUser(models.Model):
    user = models.OneToOneField(User, related_name="task_user")
    timezone = models.CharField(max_length=50, default="UTC")

我使用了South进行迁移,目前没有任何问题。在我的管理界面中,它显示为内联,同样没有问题。由于以前没有使用过South与User一起使用,我还使用了syncdb,同步了其他所有内容,也没有出现问题。
因此,根据文档,我现在应该在用户对象上有一个任务用户字段,该字段引用TaskUser对象。
如果我进入Django shell,则不是这种情况。(见In[6])
In [1]: from django.contrib.auth.models import User

In [2]: current_user = User.objects.get(pk=1)

In [3]: current_user?  
Type:       User
String Form:callum
File:       /usr/local/lib/python2.7/dist-packages/django/contrib/auth/models.py
Docstring:
Users within the Django authentication system are represented by this
model.

Username, password and email are required. Other fields are optional.

In [4]: for field in current_user._meta.fields:
    print field.name
    ...:     
id
password
last_login
is_superuser
username
first_name
last_name
email
is_staff
is_active
date_joined


In [5]: dir(current_user)
Out[5]: 
['DoesNotExist',
'Meta',
'MultipleObjectsReturned',
'REQUIRED_FIELDS',
'USERNAME_FIELD',
#I have removed many more field here
'task_user',
#And a few here
'validate_unique']

In [6]: current_user.task_user
---------------------------------------------------------------------------
DoesNotExist                              Traceback (most recent call last)
/usr/local/lib/python2.7/dist-packages/django/core/management/commands/shell.pyc in <module>()
----> 1 current_user.task_user

/usr/local/lib/python2.7/dist-packages/django/db/models/fields/related.pyc in     __get__(self, instance, instance_type)
    277             setattr(instance, self.cache_name, rel_obj)
    278         if rel_obj is None:
--> 279             raise self.related.model.DoesNotExist
    280         else:
    281             return rel_obj

DoesNotExist: 

我对这个结果有点困惑 - 似乎对象的某个地方有这个task_data字段,但不是作为关系存在?我不确定如何访问它并避免出现此错误。
提前感谢任何人能够提供帮助。
1个回答

4
当您指定 related_name 时,您并不是在 User 模型中添加字段。相反,某种描述符将被创建,因此它不会出现在 Userfields 属性中。在这种方式中定义 TaskUser 模型中的字段意味着不可能有未关联用户的 TaskUser 实例,但可能存在未关联 TaksUser 实例的 User 实例(对于 ForeignKey 关系也是如此),因此您需要确保实际创建了 TaskUser 实例;它不会自动完成。

谢谢你的回答,但那是我的错 - task_user 也失败了。我现在会更新问题,抱歉。 - Callum M
通常情况下,如果每个用户都需要一个TaskUser实例,可以通过信号来实现。您可以注册一个处理程序,在创建新用户时创建一个新的TaskUser实例,以确保每个用户都有一个有效的“task_user”。 - dm03514
@dm03514 好的,谢谢,我会研究一下的。实际上时区是可选的,因为它有一个默认值,但最简单的方法肯定是使用User创建TaskUser。谢谢。 - Callum M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接