0

select_related を使用しているときに、非常に奇妙なエラーが発生します。auth_user テーブルを拡張するモデルを作成しました。ご参考までに、以下にモデルを貼り付けます

class BasicDetails(models.Model):
   username = models.OneToOneField(User)
   name = models.CharField(max_length = 100, verbose_name = "Name")
   sex = models.CharField(max_length = 10, verbose_name = "Sex", choices = GENDER_CHOICES)
   dob = models.DateField(verbose_name = "Date of Birth")
   mothertongue = models.CharField(max_length = 20, verbose_name = "Mother Tongue", choices = LANGUAGES_CHOICES)

上記のテーブルには 1 つのレコードしかありません。django シェルで以下のクエリを実行すると、正常に動作し、値を取得できます。

basicdetails = BasicDetails.objects.select_related('auth_user__username',request.user)

ただし、ビューとテンプレートに同じクエリを入力すると、エラーが発生します。

Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
111.response = callback(request, *callback_args, **callback_kwargs)
File "/home/vikramt/python/OpenMatrimony/wedding/views.py" in myprofile
160.basicdetails = BasicDetails.objects.select_related('auth_user__username',request.user)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py" in select_related
173.return self.get_query_set().select_related(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py" in select_related
686.obj.query.add_select_related(fields)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/query.py" in     add_select_related
1759.for part in field.split(LOOKUP_SEP):
File "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py" in inner
185.return func(self._wrapped, *args)

例外の種類: /myprofile/ の AttributeError 例外値: 'User' オブジェクトには属性 'split' がありません

誰かがこの文脈で私を助けることができますか. 何が問題なのか理解できませんでした。手がかりはありますか?

-ヴィクラム

4

1 に答える 1

4

select_relatedパラメータが文字列であることを期待します。request.userオブジェクトは文字列ではなく、メソッドがありませんsplit()。そのため、AttributeError が発生しています。

しかし、トリッキーな部分は、あなたが言ったように、シェルセッション内から同じことをしたときにうまくいったということです. そのシェルのコンテキストでrequest.userは、どういうわけか文字列であったか、文字列のように動作していたと言う危険があります。

とにかく、なぜ User インスタンスを select_related に渡すのですか? つまり、それによって何を達成したいのですか?

編集

Ok, if you want to retrieve the record of BasicDetails for the current logged in user, you should be using the filter method. It's used to filter a queryset:

basicdetails = BasicDetails.objects.filter(username=request.user)

The select_related method is used to tell the ORM to do something like a SQL join to populate the specified related columns of the results.

And I would recommend you to rename your username column to something more clear. It's a relation to the user table, so you should call it just user.

于 2012-11-12T16:11:06.170 に答える