2012-11-30 9 views
7

I haben Modelle A und B, wobei B ein FK A. hatDjango Admin queryset Filterung von Fremdschlüssel Bezug rückwärts

I verwenden django 1.3 und ich brauche zwei django Admin Filter:

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

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

Wie kann ich das erreichen? Leider konnte ich beim googeln keine Lösungen finden.

+0

ist 'A.objects.filter (b__isnull = false) 'und' A.objects.filter (b__isnull = False, some_condition = False) 'Hilfe? – mkoistinen

+0

Vielleicht, aber ich frage, wie könnte ich ein benutzerdefiniertes display_filter schreiben, nicht wie eine Abfrage zu machen. – aemdy

+0

Ist ein Upgrade auf Django 1.4 eine Option? Listenfilter sind dort viel flexibler geworden. Sie können im Grunde Ihre eigene Liste Filterklasse angeben: https://docs.djangoproject.com/en/1.4/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter – ptrck

Antwort

5

Sie müssen dies lesen: Custom Filter in Django Admin on Django 1.3 or below

Dies ist mein erster Versuch, ohne Prüfung, aber Sie sollten mehr oder weniger, wie ihre getan sehen -

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

Was @ptrck erwähnt ist richtig. Könntest du nicht zu 1.4 wechseln?

In diesem Fall, wie in the doc beschrieben, ohne dass die Lookups zu ändern, so etwas wie (zum ersten hier und dann dem zweiten entsprechend):

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)