def run_autooptimization_discovery(serializer, prefix, select_related_set, prefetch_related_set, is_prefetch,
only_fields, include_fields):
if not hasattr(serializer, "Meta") or not hasattr(serializer.Meta, "model"):
return
model_class = serializer.Meta.model
if hasattr(serializer, "get_on_demand_fields"):
on_demand_fields = serializer.get_on_demand_fields()
else:
on_demand_fields = set()
def filter_field_name(field_name, fields_to_serialize):
if fields_to_serialize is not None:
return ContextPassing.filter_fields(field_name, fields_to_serialize)
return None
for field_name, field in serializer.fields.items():
if hasattr(serializer, "check_if_needs_serialization"):
if not serializer.check_if_needs_serialization(field_name, only_fields, include_fields, on_demand_fields):
continue
if isinstance(field, ListSerializer):
if "." not in field.source and hasattr(model_class, field.source):
model_field = getattr(model_class, field.source)
if check_if_prefetch_object(model_field):
prefetch_related_set.add(prefix + field.source)
run_autooptimization_discovery(field.child, prefix + field.source + "__", select_related_set,
prefetch_related_set, True,
filter_field_name(field_name, only_fields),
filter_field_name(field_name, include_fields))
elif isinstance(field, Serializer):
if "." not in field.source and hasattr(model_class, field.source):
model_field = getattr(model_class, field.source)
if check_if_related_object(model_field):
if is_prefetch:
prefetch_related_set.add(prefix + field.source)
else:
select_related_set.add(prefix + field.source)
run_autooptimization_discovery(field, prefix + field.source + "__", select_related_set,
prefetch_related_set, is_prefetch,
filter_field_name(field_name, only_fields),
filter_field_name(field_name, include_fields))
elif "." in field.source:
field_name = field.source.split(".", 1)[0]
if hasattr(model_class, field_name):
model_field = getattr(model_class, field_name)
if check_if_related_object(model_field):
select_related_set.add(prefix + field_name)
评论列表
文章目录