3

モデル内の関数でクエリセットをフィルター処理したいと思います。

class CommentAdmin(admin.ModelAdmin):

    class PostedByGuestFilter(admin.SimpleListFilter):

        title = 'Posted by Guest'
        parameter_name = 'posted_by_guest'

        def lookups(self, request, model_admin):
            return (
                (True, 'Yes'),
                (False, 'No'),
            )

        def queryset(self, request, queryset):
            if self.value():
                return [comment for comment in queryset if comment.posted_by_guest()]
            elif not self.value():
                return [comment for comment in queryset if not comment.posted_by_guest()]

残念ながら、この実装によりdjango.admin、データベースが破損していることが通知されます。この問題を解決するにはどうすればよいですか?

ここに画像の説明を入力

4

2 に答える 2

3

comment.posted_by_guest()それは最適ではありません (余分な SQL クエリが発生します)。可能であれば、ロジックを SQLに移動する方法を探しています(ヘルプが必要な場合は、そのメソッドの本体を表示します)。仕事:

def queryset(self, request, queryset):
    expected_value = self.value()
    excludes = []
    for comment in queryset:
        if comment.posted_by_guest() != expected_value:
            excludes.append(comment.id)
    return queryset.exclude(pk__in=excludes)

Django 管理フィルター API は、いくつかの改善を行うことができます!

于 2013-08-22T00:03:52.180 に答える
2

ここでの問題は、Django がクエリセットを予期していて、コードがリストを提供していることです。これは、理解をセットにラップすることで修正できます。

    def queryset(self, request, queryset):
        if self.value():
            return set(comment for comment in queryset if comment.posted_by_guest())
        elif not self.value():
            return set(comment for comment in queryset if not comment.posted_by_guest())
于 2012-09-28T22:07:08.933 に答える