def test_in_with_queryset_as_arg(self): main = MiscModel() main.save() MiscModel(foreign=main, integer=1, text='a').save() MiscModel(foreign=main, integer=2, text='a').save() MiscModel(foreign=main, integer=3, text='b').save() MiscModel(foreign=main, integer=4, text='b').save() a_models = MiscModel.objects.filter(text='a') all_models = list(MiscModel.objects.all()) db_results = MiscModel.objects.filter(miscmodel__in=a_models) mem_results = filter_by_q(all_models, Q(miscmodel__in=a_models)) self.assertEqual(set(db_results), set(mem_results))
def assert_q_executes_the_same_in_python_and_sql(self, model, q, expected_count=NOT_SET, raise_original_exceptions=False, lookup_adapter=None, raise_invalid_usage=True): all_objs = list(model.objects.all()) try: qs = model.objects.filter(q) db_result = list(qs) except Exception as e: db_result = e try: mem_result = filter_by_q(all_objs, q, lookup_adapter=lookup_adapter) except InvalidLookupUsage as e: mem_result = e if raise_invalid_usage: raise except Exception as e: mem_result = e if isinstance(db_result, Exception) and isinstance(mem_result, Exception): return if raise_original_exceptions: if isinstance(db_result, Exception): raise db_result if isinstance(mem_result, Exception): raise mem_result if set(db_result) != set(mem_result): try: sql = str(qs.query) except: sql = '' raise DoesNotMatchDbExecution( q=q, db_result=db_result, py_result=mem_result, sql=sql ) if expected_count != NOT_SET and expected_count != len(mem_result): raise Exception('Did not behave as expected.')