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

Popular posts from this blog

python - TypeError: start must be a integer -

c# - DevExpress RepositoryItemComboBox BackColor property ignored -

django - Creating multiple model instances in DRF3 -