2012-03-15 19 views
0

私はItemAdmin内django ManyToManyFieldのQuerysetフィルタ?

def queryset(self, request): 

をオーバーライドすることで、結果を制限しようとしています。

私は、request.userにユーザープロファイルを使用してカテゴリアクセスが許可されているアイテムのみを表示します。

class Profile(models.Model): 
    user = models.ForeignKey(auth.User, unique=True) 
    categoryAccess = models.ManyToManyField(Category ...) 

class Item(models.Model): 
    category = models.ForeignKey(Category ...) 

私はかなりの構文の権利を得ることができない....私は

class ItemAdmin(admin.ModelAdmin): 
    def queryset(self, request): 
     qs = super(ItemAdmin, self).queryset(request) 
     return qs.filter(category__in=request.user.objects__profile__categoryAccess) 

任意のアイデアのようなものをしようとしていますか?どうもありがとう!

答えて

2

フィルタの二重アンダースコアの構文は、式の左辺でのみ使用されます(実際には、関数のキーワード引数であり、式ではないことを知るためのハックです) 。あなたは、移行する必要はありません(OneToOneFieldにあなたのuserのForeignKeyを変換する必要があり、この作業をする

return qs.filter(category__in=request.user.profile.categoryAccess.all()) 

注:.だからあなたはおそらく、この欲しい:右側には、オブジェクトを通過する通常の構文を使用していますデータベース、モデル定義を変更するだけです)。

+0

ちょっとダニエル!ありがとうございました...私はOneToOneにフィールドを変更しましたが、プロファイル一致クエリは存在しません。 – cssndrx

+0

よろしく!それは実際には私の悪いことです。作成時にユーザーがプロファイルを持っていなかったため、コードが壊れました。例外をキャッチして空のリストを返すだけでいいですか?修正をありがとう:) – cssndrx

+1

ちょうど確認する...後方の関係のuser.profileは正しく動作するでしょうか?ドキュメントでは、後方の関係が__構文で可能であることがわかりました。しかし、私がプロファイルを作成してフィルターをかけようとすると、私は非伝統的なDjangoエラーを受け取ります。データベースのエラー:データベースのインストールに問題があります。適切なデータベーステーブルが作成されていることを確認し、適切なユーザーがデータベースを読み込めるようにしてください。誰もこれを見たことがありますか? – cssndrx

関連する問題