4

ここで、1 対 1 の関係が逆に機能していないように見える奇妙な問題があります。コードで説明するのが最も簡単です。

次のように、タイムゾーンを追加するためにデフォルトの 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 を使用して移行しましたが、これまでのところ問題はありません。管理画面にインラインで表示されますが、これも問題ありません。以前に User で South を使用したことがないため、syncdb も使用しました。これにより、他のすべてが問題なく同期されました。

したがって、ドキュメントによると、TaskUser オブジェクトを参照する User オブジェクトにフィールド task_user が必要になりました。

Django シェルに入ると、そうではありません。(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 フィールドがどこかにあるようですが、関係としてではありませんか? アクセスしてこのエラーを回避する方法がよくわかりません。

誰でも提供できるヘルプを事前に感謝します。

4

1 に答える 1

4

Userrelated_name を指定すると、モデルにフィールドが追加されません。代わりに、ある種の記述子が作成されるため、Userfieldsプロパティには表示されません。TaskUserこのようにモデルでフィールドを定義するとTaskUser、関連付けられたユーザーなしでインスタンスを持つことはできませんが、関連付けられたインスタンスUserなしでインスタンスを持つことは可能です (関係についてTaksUserも同じことが当てはまります)。実際に作成された; 自動的には行われません。ForeignKeyTaskUser

于 2013-05-19T15:30:05.043 に答える