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