2012-11-30 10 views
7

ho modelli A e B, dove B ha un FK ad A.Django filtraggio amministratore queryset da chiave esterna indietro rispetto

Io uso Django 1.3 e ho bisogno di due filtri Django admin:

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

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

Come posso ottenerlo? Purtroppo, non ho trovato nessuna soluzione googling.

+0

Does 'A.objects.filter (b__isnull = false) 'e' A.objects.filter (b__isnull = False, some_condition = False) 'aiuto? – mkoistinen

+0

Forse, ma sto chiedendo come potrei scrivere un display_filter personalizzato, non come fare una query. – aemdy

+0

L'aggiornamento a Django 1.4 è un'opzione per caso? I filtri delle liste sono diventati molto più flessibili. Puoi fondamentalmente specificare la tua classe di filtro di elenco: https://docs.djangoproject.com/en/1.4/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter – ptrck

risposta

5

Hai bisogno di leggere questo: Custom Filter in Django Admin on Django 1.3 or below

Questo è il mio primo tentativo, senza alcun test, ma si dovrebbe vedere più o meno come il suo fare -

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

Ciò che @ptrck ha menzionato è giusto. Non potresti passare a 1.4?

In questo caso, come in the doc descritto, senza bisogno di cambiare le ricerche, fare qualcosa di simile (per la prima qui e poi la seconda conseguenza):

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) 
Problemi correlati