我有模型A和B,其中B有FK到ADjango管理查詢集外鍵向後關係過濾
我使用Django 1.3,我需要兩個Django管理篩選器:
1) a.b_set.exists() # (True/False)
2) not a.b_set.filter(some_condition=False).exists() # (True/False)
我怎樣才能做到這一點?可悲的是,我找不到任何解決方法。
我有模型A和B,其中B有FK到ADjango管理查詢集外鍵向後關係過濾
我使用Django 1.3,我需要兩個Django管理篩選器:
1) a.b_set.exists() # (True/False)
2) not a.b_set.filter(some_condition=False).exists() # (True/False)
我怎樣才能做到這一點?可悲的是,我找不到任何解決方法。
你需要閱讀本:Custom Filter in Django Admin on Django 1.3 or below
這是我沒有任何測試的第一次嘗試,但你應該看到更多或更少如何做 -
from django.db import models
from django.contrib.admin.filterspecs import FilterSpec, ChoicesFilterSpec
from django.utils.encoding import smart_unicode
from django.utils.translation import ugettext as _
class BNullSetFilterSpec(FilterSpec):
def __init__(self, f, request, params, model, model_admin):
super(BSetFilterSpec, self).__init__(f, request, params, model, model_admin)
self.links = (
('Yes', {'b__isnull': False}),
('No', {}))
def title(self):
return _('B Set')
# registering the filter
FilterSpec.filter_specs.insert(0, (lambda f: getattr(f, 'empty_bset', False), BNullSetFilterSpec))
@ptrck提到的是正確的。你不能切換到1.4嗎?
在這種情況下,如the doc描述,而不需要改變查找,像做(這裏的第一,然後相應地第二):
from django.contrib.admin import BooleanFieldListFilter
class BInA(BooleanFieldListFilter):
def queryset(self, request, queryset):
if self.value() is True:
return queryset.filter(a.b_set.exists())
else:
return queryset.filter(a.b_set.exists() is False)
是否'A.objects.filter(b__isnull =假)'和'A.objects.filter(b__isnull = False,some_condition = False)'help? – mkoistinen
也許,但我問我怎麼可以寫一個自定義的display_filter,而不是如何進行查詢。 – aemdy
是否有任何機會升級到Django 1.4選項?列表過濾器在那裏變得更加靈活。你基本上可以指定你自己的列表過濾器類:https://docs.djangoproject.com/en/1.4/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter – ptrck