2012-11-30 27 views
7

I model A ve B Django 1.3 kullanımı ve iki Django yönetici filtreleri mi A.Django yönetici QuerySet filtreleme

bir FK sahip B, sahiptir:

1) a.b_set.exists() # (True/False) 

2) not a.b_set.filter(some_condition=False).exists() # (True/False) 

Bunu nasıl başarabilirim? Ne yazık ki, googling ile herhangi bir çözüm bulamadım.

+0

'A.objects.filter mu (b__isnull = False -

Bu, herhangi bir test yapmadan benim ilk girişimi, ancak fazla veya daha az onun yapılması nasıl görmelisiniz) 've' A.objects.filter (b__isnull = False, some_condition = False) yardım? – mkoistinen

+0

Belki, ama nasıl bir sorgu yapmak için değil, nasıl özel bir display_filter yazabilirim diye soruyorum. – aemdy

+0

Django 1.4'e bir seçenek yükseltme şansı var mı? Liste filtreleri burada daha esnek bir hale geldi. Temel olarak kendi liste filtre sınıfınızı belirtebilirsiniz: https://docs.djangoproject.com/en/1.4/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter – ptrck

cevap

5

Buna okumaya gerek: Custom Filter in Django Admin on Django 1.3 or below

(burada birinci ve buna göre ikinci için) böyle bir şey yapmak, aramaları değiştirmeye gerek kalmadan, tarif the doc olduğu gibi bu durumda

,

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

Belirtilen @ @ doğru doğrudur. 1.4'e geçiş yapamaz mıydınız?

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)