2017-01-10 2 views
0

Ich versuche, einige Datensätze (über Zeitschriften) aus der Datenbank zu extrahieren, um Tabelle mit Statistiken zu erstellen. Die Extraktion erfolgt nach Zeitraum und Name des Magazins. Hier ist der Code, den ich zur Zeit, aber ich nehme an, es nicht trocken genug ist, um aus zwei Gründen:Django. ORM-Filter nach Funktion Schlüsselwort Argument

def get_statistic(date__gte=None, date__lte=None, name=None): 
    magazines_qs = Magazines.objects.all() 

    #1 move filters to "for" 
    #2 get rid of "if" statement (may be by setting default values which 
    #        makes filter equal to .all() method) 
    if date__gte: 
     magazines_qs = magazines_qs.filter(date__gte=date__gte) 
    if date__lte: 
     magazines_qs = magazines_qs.filter(date__lte=date__lte) 
    if offer: 
     magazines_qs = magazines_qs.filter(name=name) 

Ich nehme an, es möglich ist, etwas zu erhalten wie:

def get_statistic(date__gte=None, date__lte=None, name=None): 
    magazines_qs = Magazines.objects.all() 

    for filter in arguments() 
     magazines_qs = magazines_qs.filter(filter) 

Aber ich nicht Fachwissen.

Antwort

0

eine Lösung Um zu zeigen, die näher an den Original-Code, so dass es akzeptiert nur eine bestimmte Menge von Argumenten (es ist eine Kombination der beiden bestehenden Antworten):

def get_statistic(date__gte=None, date__lte=None, name=None): 
    filter_args = {'date__gte': some_date, 'date__lte': some_other_date, 'name': name} 
    filter_args = dict((k,v) for k,v in filter_args.iteritems() if v is not None) 
    magazines_qs = Magazines.objects.filter(**filter_args) 

Hinweis: Dies natürlich funktioniert nur, wenn Sie keinen Fall haben, in dem Sie darauf vertrauen, dass None an die Filtermethode übergeben wird.

1

Sie können dies tun, werden die Parameter unter der Annahme, immer nur nach links und nicht explizit übergeben als None.

def get_statistics(**kwargs): 
    return Magazines.objects.filter(**kwargs) 

kwargs wird ein dict nur das Schlüsselwort Argumente enthält, die in explizit übergeben werden .filter(**kwargs) diese auspackt in Schlüsselwortargumente, die an filter() übergeben werden.

Verwandte Themen