2012-11-30 111 views
7

我有模型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) 

我怎樣才能做到這一點?可悲的是,我找不到任何解決方法。

+0

是否'A.objects.filter(b__isnull =假)'和'A.objects.filter(b__isnull = False,some_condition = False)'help? – mkoistinen

+0

也許,但我問我怎麼可以寫一個自定義的display_filter,而不是如何進行查詢。 – aemdy

+0

是否有任何機會升級到Django 1.4選項?列表過濾器在那裏變得更加靈活。你基本上可以指定你自己的列表過濾器類:https://docs.djangoproject.com/en/1.4/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter – ptrck

回答

5

你需要閱讀本: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)) 
1

@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)