2010-11-22 26 views
0

- 私のviews.pyに今Djangoのモデルの外部キーフィールドの一致

class M(models.Model): 
    ... 
    disp_name = models.CharField(max_length=256, db_index=True) 
    ... 

class XX(models.Model): 
    x = models.ForeignKey(User) 
    y = models.ForeignKey(M, unique=True) 

は、私がフィールドy.disp_nameとXX内のすべての項目で、部分文字列一致をしたいです。

通常1はこれを行うだろう - M.objects.filter(disp_name__istartswith='string')

しかし、ここでMModel XXでのForeignKeyです。だから私がしたらXX.objects.filter(y.disp_name__istartswith='string')私はエラーが発生します。

はまた、これも失敗した - SyntaxError: keyword can't be an expression (<console>, line 1)

これを実行する方法 - 私が取得 u = User.objects.get(id=1) u.xx_set.filter(y.disp_name__istartswith='string')

例外があると言いますか?

答えて

2

X、Y、Mではなく、適切なフィールド名を使用していただければ幸いです。

しかし、いずれにしても、あなたは常に、フィルタ式の左側の関係を追跡するために二重アンダースコアの構文を使用する必要があります。

XX.objects.filter(y__disp_name__istartswith='string') 

(このための技術的な理由はfilterへのパラメータであります実際には関数のキーワード引数なので、左辺は式ではなく文字列でなければなりません)

+0

申し訳ありませんが、会社のルール。ありがとう、それは問題を解決しました!だからdjangoは '__'のLHS部分を分割してフィールドとして使用しますか? –

+1

はい、ほとんどの場合、ルックアップタイプ( 'in'、' istartswith'など)との結合を区別する必要があるため、当然もっと複雑です。興味があるなら 'django.db.models.sql.query.Query.add_filter'のコードを見てください。 –

関連する問題