2012-03-17 10 views
0

Django/Python newbie here。django - モデルのデフォルト表現でのフィルタリング

のが、このページのジャンゴ帳から例のテーブルを使用してみましょう:ここhttp://www.djangobook.com/en/2.0/chapter10/

class Author(models.Model): 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=40) 
    email = models.EmailField() 

    def __unicode__(self): 
     return u'%s %s' % (self.first_name, self.last_name) 

は、著者のテーブルにアクセスするために使用される例のフィルタ文です:

a = Author.objects.get(first_name='Adrian', last_name='Holovaty') 

何私はドン場合最初と最後の名前が別々の変数にありますか?もし私が名前全体を一緒に持っていたら?私は次のようなことをしたいと思っています:

aName = 'Adrian Holovaty' 
a = Author.objects.get(Author.self=aName) 

何とかそのオブジェクト表現 "プロパティ"にアクセスしたいと思っています。確かに私は空間上のaNameを分割し、上記のようにルックアップを行うことができます。しかし、名前全体を分割する方法があまり明確でない場合はどうすればよいでしょうか? 「ニューヨーク・ニックス」や「リップ・ヴァン・ウィンクル」のようなものを分けようとしていたとします。最初の例では、first_nameは "New York"、2番目の例では "Rip"になります。あなたがそれを行うことはできません

+1

だから...どの質問をしていますか? –

+0

私はフィルタ内の__unicode __(self) "プロパティ"にアクセスしたい、あるいはテーブルに乗りたいです。 – Cromulent

答えて

1

理由は__unicode__は、クエリセットのSQLによって選択たデータを使用して、Pythonでを評価されていることです。

したがって、データベースがPythonメソッド__unicode__によって生成された値を予測する方法はありません。

  1. あなたが検索でdjango-haystackに依存している場合、あなたはモデルクラスのテンプレートでobject.__unicode__の結果である{{ object }}を置くことができます多くの方法がある、と述べた

    。次に、__unicode__出力で検索を有効にすることができます。

  2. pre_save signal receiver、あなたが(cached_unicode = 'Fooのバーを')フィルタリングすることができ、self.cached_unicodeを更新する(save() methodをオーバーライドする)

  3. 使用SQL CONTACT(author.first_nameを使用し、モデルにcached_unicode CharFieldですを追加Author.objects.raw()とのいずれかauthor_queryset.extra()

+0

一口。より簡単な方法が必要です。私は本当に「a = Author.objects.get(first_name + last_name = 'Adrian Holovaty')」を実行できるようにしたいと思っていますが、それは「キーワード」エラーを起こします。 – Cromulent

+0

あなたはどのくらいの 'Authors 'を扱っていますか?スペースでクエリ文字列を分割し、可能な姓のそれぞれに対して複数のルックアップを実行することができます。一致する 'Authors'の場合、' __unicode__'表現が完全なクエリ名と一致するかどうかをチェックします。単一のデータベースルックアップほど良くはありませんが、あなたの目的のためには、それは十分に速くて十分かもしれません。 –

+0

私はあなたが一般的な方法を求めていると思っていたので、__unicode__がどのように構築されているかを知っていれば、2つのソリューションを追加しました(つまり、名前スペースの姓を連結していることがわかります)。ご意見ありがとうございます! – jpic

0

とのいずれかで、「」、author.last_name)=「Fooのバーには、」名前だけを分割して、クエリをpeformsあなたのクラスにgetbynameメソッドを追加します。ジョブが完了しました。

+0

名前を分ける場所がわからない場合は、どのように名前を分割しますか?また、 "getbyname"の追跡に問題があります。 – Cromulent

+0

@Cromulentあなたがそれを書くまでそれを見つけることはできません。分割については、あなたがデザインすることです。 – Marcin

関連する問題