644 Stimmen

Wie filtert man leere oder NULL-Namen in einem QuerySet?

Ich habe first_name , last_name & alias (fakultativ), nach denen ich suchen muss. Ich brauche also eine Abfrage, die mir alle Namen liefert, die einen Alias haben.

Nur wenn ich es könnte:

Name.objects.filter(alias!="")

Was ist also das Äquivalent zu den oben genannten Punkten?

5voto

Ab Django 1.8,

from django.db.models.functions import Length

Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)

4voto

Tim Tisdall Punkte 9069

Sie können dies einfach tun:

Name.objects.exclude(alias="").exclude(alias=None)

Es ist wirklich so einfach. filter wird zum Abgleichen und exclude ist es, alles andere als das, was er angibt, zu übernehmen. Dies würde in SQL wie folgt ausgewertet NOT alias='' AND alias IS NOT NULL .

3voto

rptmat57 Punkte 3475

Ein anderer Ansatz mit einem generischen isempty Lookup, das mit jedem Feld verwendet werden kann.

Es kann auch von django rest_framework oder anderen Anwendungen verwendet werden, die django lookups verwenden:

from distutils.util import strtobool
from django.db.models import Field
from django.db.models.lookups import BuiltinLookup

@Field.register_lookup
class IsEmpty(BuiltinLookup):
    lookup_name = 'isempty'
    prepare_rhs = False

    def as_sql(self, compiler, connection):
        sql, params = compiler.compile(self.lhs)
        condition = self.rhs if isinstance(self.rhs, bool) else bool(strtobool(self.rhs))
        if condition:
            return "%s IS NULL or %s = ''" % (sql, sql), params
        else:
            return "%s <> ''" % sql, params

Sie können es dann wie folgt verwenden:

Name.objects.filter(alias__isempty=False)

0voto

ImadOS Punkte 425

Dies ist eine weitere einfache Möglichkeit.

Name.objects.exclude(alias=None)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X