EDIT: The best solution thanks to Hakan -
queriedForms.filter(pk__in=list(formtype.form_set.all().filter(formrecordattributevalue__record_value__contains=constraint['TVAL'], formrecordattributevalue__record_attribute_type__pk=rtypePK).values_list('pk', flat=True))).count()
I tried more of my suggestions, but I can’t avoid INNER JOIN - it seems like a stable solution, which is not enough for me, but the predicted speed is increasing in all directions. See his answer for more details!
I was struggling with a problem that I did not see on the Internet.
When connecting two filters in Django, for example.
masterQuery = bigmodel.relatedmodel_set.all()
masterQuery = masterQuery.filter(name__contains="test")
masterQuery.count()
storedCount = masterQuery.filter(name__contains="9").count()
Trying a little different:
masterQuery = masterQuery.filter(name__contains="9")
masterQuery.count()
merging and merging seems to improve performance a bit, like
masterQuery = bigmodel.relatedmodel_set.all()
masterQuery = masterQuery.filter(name__contains="test")
(masterQuery & masterQuery.filter(name__contains="9")).count()
It seems that the counter takes significantly longer outside of one filter in the query set.
, - mySQL, , -, , , , mySQL, , SELECT COUNT (*) django
, : ? ( ) . 100 000 , , 100 000. , , len(), 5 , 40 , 3 + - , . - , ?
EDIT: - time.clock() .3 () - django - 5-6
EDIT2: , , :
mainQuery = masterQuery = bigmodel.relatedmodel_set.all()
mainQuery = mainQuery.filter(reverseforeignkeytestmodel__record_value__contains="test", reverseforeignkeytestmodel__record_attribute_type__pk=1)
mainQuery.count()
mainQuery.filter(reverseforeignkeytestmodel__record_value__contains="9", reverseforeignkeytestmodel__record_attribute_type__pk=5).count()
, , (, ), , - . .
3:
, , . < 10 000 , - . 10000 ~ 1 , 5000 ~ 1
4:
@Hakan
mainQuery = bigmodel.relatedmodel_set.all()
mainQuery = mainQuery.filter(reverseforeignkeytestmodel__record_value__contains="test", reverseforeignkeytestmodel__record_attribute_type__pk=1)
values = bigmodel.relatedmodel_set.all().filter(reverseforeignkeytestmodel__record_value__contains="test", reverseforeignkeytestmodel__record_attribute_type__pk=8).values_list('pk', flat=True)
mainQuery = mainQuery.filter(pk__in=values)
mainQuery.count()
, , value_list, . . - , ,
5:
@Hakan
mainQuery.filter(pk__in=list(formtype.form_set.all().filter(formrecordattributevalue__record_value__contains=constraint['TVAL'], formrecordattributevalue__record_attribute_type__pk=rtypePK).values_list('pk', flat=True))).count()
, -, , . > 50 000, , . < 50 000 - , < 1 - 2-3 1 , 1 . , - .
, , . (, ), , .