Provide an iterator which converts the results of raw SQL queries into annotated model instances.
| 2360 | |
| 2361 | |
| 2362 | class RawQuerySet: |
| 2363 | """ |
| 2364 | Provide an iterator which converts the results of raw SQL queries into |
| 2365 | annotated model instances. |
| 2366 | """ |
| 2367 | |
| 2368 | def __init__( |
| 2369 | self, |
| 2370 | raw_query, |
| 2371 | model=None, |
| 2372 | query=None, |
| 2373 | params=(), |
| 2374 | translations=None, |
| 2375 | using=None, |
| 2376 | hints=None, |
| 2377 | fetch_mode=DEFAULT_FETCH_MODE, |
| 2378 | ): |
| 2379 | self.raw_query = raw_query |
| 2380 | self.model = model |
| 2381 | self._db = using |
| 2382 | self._hints = hints or {} |
| 2383 | self.query = query or sql.RawQuery(sql=raw_query, using=self.db, params=params) |
| 2384 | self.params = params |
| 2385 | self.translations = translations or {} |
| 2386 | self._result_cache = None |
| 2387 | self._prefetch_related_lookups = () |
| 2388 | self._prefetch_done = False |
| 2389 | self._fetch_mode = fetch_mode |
| 2390 | |
| 2391 | def resolve_model_init_order(self): |
| 2392 | """Resolve the init field names and value positions.""" |
| 2393 | converter = connections[self.db].introspection.identifier_converter |
| 2394 | model_init_fields = [ |
| 2395 | field |
| 2396 | for column_name, field in self.model_fields.items() |
| 2397 | if column_name in self.columns |
| 2398 | ] |
| 2399 | annotation_fields = [ |
| 2400 | (column, pos) |
| 2401 | for pos, column in enumerate(self.columns) |
| 2402 | if column not in self.model_fields |
| 2403 | ] |
| 2404 | model_init_order = [ |
| 2405 | self.columns.index(converter(f.column)) for f in model_init_fields |
| 2406 | ] |
| 2407 | model_init_names = [f.attname for f in model_init_fields] |
| 2408 | return model_init_names, model_init_order, annotation_fields |
| 2409 | |
| 2410 | def prefetch_related(self, *lookups): |
| 2411 | """Same as QuerySet.prefetch_related()""" |
| 2412 | clone = self._clone() |
| 2413 | if lookups == (None,): |
| 2414 | clone._prefetch_related_lookups = () |
| 2415 | else: |
| 2416 | clone._prefetch_related_lookups = clone._prefetch_related_lookups + lookups |
| 2417 | return clone |
| 2418 | |
| 2419 | def _prefetch_related_objects(self): |
no outgoing calls