MCPcopy
hub / github.com/django/django / _get_field_expression_map

Method _get_field_expression_map

django/db/models/base.py:1387–1431  ·  view source on GitHub ↗
(self, meta, exclude=None)

Source from the content-addressed store, hash-verified

1385 return getattr(self, cachename)
1386
1387 def _get_field_expression_map(self, meta, exclude=None):
1388 if exclude is None:
1389 exclude = set()
1390 meta = meta or self._meta
1391 field_map = {}
1392 generated_fields = []
1393 for field in meta.local_fields:
1394 if field.name in exclude:
1395 continue
1396 if field.generated:
1397 if any(
1398 ref[0] in exclude
1399 for ref in self._get_expr_references(field.expression)
1400 ):
1401 continue
1402 generated_fields.append(field)
1403 continue
1404 if (
1405 isinstance(field.remote_field, ForeignObjectRel)
1406 and field not in meta.local_concrete_fields
1407 ):
1408 value = tuple(
1409 getattr(self, from_field) for from_field in field.from_fields
1410 )
1411 if len(value) == 1:
1412 value = value[0]
1413 elif field.concrete:
1414 value = getattr(self, field.attname)
1415 else:
1416 continue
1417 if not value or not hasattr(value, "resolve_expression"):
1418 value = Value(value, field)
1419 field_map[field.name] = value
1420 field_map[field.attname] = value
1421 if "pk" not in exclude:
1422 field_map["pk"] = Value(self.pk, meta.pk)
1423 if generated_fields:
1424 replacements = {F(name): value for name, value in field_map.items()}
1425 for generated_field in generated_fields:
1426 field_map[generated_field.name] = ExpressionWrapper(
1427 generated_field.expression.replace_expressions(replacements),
1428 generated_field.output_field,
1429 )
1430
1431 return field_map
1432
1433 def prepare_database_save(self, field):
1434 if not self._is_pk_set():

Callers 3

validateMethod · 0.80
validateMethod · 0.80
validateMethod · 0.80

Calls 7

_get_expr_referencesMethod · 0.95
ValueClass · 0.90
ExpressionWrapperClass · 0.90
FClass · 0.70
appendMethod · 0.45
itemsMethod · 0.45
replace_expressionsMethod · 0.45

Tested by

no test coverage detected