python - Django: extend queryset or exclude from exclude method -
i have django app need combine 2 querysets, , disregard exclude() filter items.
here example of model , query.
class mymodel(models.model): name = models.charfield(max_length=20) var1 = models.integerfield() var2 = models.booleanfield() var3 = models.booleanfield() var4 = models.integerfield() var5 = models.integerfield() qs1 = mymodel.objects.filter(var1__lte=10,var2=true).exclude(q(var4=10) | q(var5=20)) must_include_list = ['name1','name2','name3'] qs2 = mymodel.objects.filter(name__in=must_include_list)
i need have single queryset filter , exclude qs1, includes rows qs2 regardless of whether match qs1 filter , exclude.
i tried doing this:
qs1 = mymodel.objects.filter(q(var1__lte=10,var2=true) | q(name__in=must_include_list)).exclude(q(var4=10| | q(var5=20))
but still applies exclude must_include_list, miss of required entries.
is there way tell exclude() not exclude items in must_include_list, or there way combine 2 since querysets don't have extend() method?
my solution based on bakkal's suggestion.
include = q(var1__lte=10,var2=true) exclude = q(var4=10) | q(var5=20) must_include = q(name__in=must_include_list) filter = (include & ~exclude) | must_include mymodel.objects.filter(filter).distinct()
let's rewrite
mymodel.objects.filter(var1__lte=10,var2=true).exclude(q(var4=10) | q(var5=20))
as
x = q(var1__lte=10, var2=true) & ~(q(var4=10) | q(var5=20)) mymodel.objects.filter(x)
the other query simply
y = q(name__in=must_include_list)
now want x or y so
mymodel.objects.filter(x | y)
tip: if rename x , y meaningful names, code become readable , clean, , less cryptic reading nested filter/exclude , logic operators
Comments
Post a Comment