o a@sfdZddlmZddlmZddlmZmZddlm Z Gdddej Z edd d d Z d d Z dS)z A Python "serializer". Doesn't do much serializing per se -- just converts to and from basic Python data types (lists, dicts, strings, etc.). Useful as a basis for other serializers. )apps)base)DEFAULT_DB_ALIASmodels)is_protected_typec@sdeZdZdZdZddZddZddZd d Zd d Z d dZ ddZ ddZ ddZ ddZdS) Serializerz7 Serialize a QuerySet to basic Python objects. TcCsd|_g|_dSN)_currentobjectsselfr @/usr/lib/python3/dist-packages/django/core/serializers/python.pystart_serializations zSerializer.start_serializationcCsdSrr r r r rend_serializationszSerializer.end_serializationcCs i|_dSr)r r objr r r start_objects zSerializer.start_objectcCs|j||d|_dSr)r appendget_dump_objectr rr r r end_objects zSerializer.end_objectcCs@dt|ji}|jrt|ds|||jj|d<|j|d<|S)Nmodel natural_keypkfields)str_metause_natural_primary_keyshasattr_value_from_fieldrr )r rdatar r rr"s  zSerializer.get_dump_objectcCs ||}t|r |S||Sr)value_from_objectrvalue_to_string)r rfieldvaluer r rr)s zSerializer._value_from_fieldcCs||||j|j<dSr)rr name)r rr#r r r handle_field0szSerializer.handle_fieldcCsP|jrt|jjdrt||j}|r|}n d}n|||}||j|j<dS)Nr) use_natural_foreign_keysr remote_fieldrgetattrr%rrr )r rr#relatedr$r r rhandle_fk_field3s   zSerializer.handle_fk_fieldcsz|jjjjr;jrt|jjdrddnfddt|di|j t||j  }fdd|Dj |j <dSdS)NrcSs|Sr)rr$r r r m2m_valueAsz.Serializer.handle_m2m_field..m2m_valuecs||jjSr)rrrr,r r rr-Ds_prefetched_objects_cachecsg|]}|qSr r ).0r*)r-r r Jsz/Serializer.handle_m2m_field..) r(throughr auto_createdr'rrr)getr%iteratorr )r rr#m2m_iterr )r-r rhandle_m2m_field>s    zSerializer.handle_m2m_fieldcCs|jSr)r r r r rgetvalueLszSerializer.getvalueN)__name__ __module__ __qualname____doc__internal_use_onlyrrrrrrr&r+r6r7r r r rr s rF)usingignorenonexistentc ks|dd}i}|D]2}zt|d}Wn tjy#|r"Yq wi}d|vrVz|jj|d||jjj<Wnt yU} ztj | |d|ddd} ~ wwi} i} ||vrjdd|j D||<||} |d D]\} }|r| | vrqt|j | }|jrt|jtjrz t||||}Wntjy} ztj | j|d|d| jd} ~ ww|tjkr|| |<qt|| |j<qt|jr t|jtjr z t||||}Wnt y} ztj | |d|d|d} ~ ww|tjkr|| |<qt|||j<qtz ||||j<Wqtt y.} ztj | |d|d|d} ~ wwt|||}t|| | Vq dS) z Deserialize simple Python objects back into Django ORM instances. It's expected that you pass the Python objects themselves (instead of a stream or a string) to the constructor handle_forward_referencesFrrNcSsh|]}|jqSr )r%)r/fr r r mszDeserializer..r)pop _get_modelrDeserializationErrorrr to_pythonr3attname ExceptionWithData get_fieldsitems get_fieldr( isinstancer ManyToManyReldeserialize_m2m_valuesM2MDeserializationError original_exc DEFER_FIELDr% ManyToOneReldeserialize_fk_valuebuild_instanceDeserializedObject) object_listr=r>optionsr?field_names_cachedModelr em2m_datadeferred_fields field_names field_name field_valuer#valuesr$rr r r DeserializerPsr  "         rbc Cs.zt|WSttfytd|w)z6Look up a model from an "app_label.model_name" string.zInvalid model identifier: '%s')r get_model LookupError TypeErrorrrD)model_identifierr r rrCs  rCN) r; django.appsrdjango.core.serializersr django.dbrrdjango.utils.encodingrrrbrCr r r rs   C H