o
    ˜¨ÊhZ  ã                   @   sf   d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	 G dd„ dej
ƒZ
edd	œd
d„Zdd„ ZdS )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_ALIASÚmodels)Úis_protected_typec                   @   sd   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )Ú
Serializerz7
    Serialize a QuerySet to basic Python objects.
    Tc                 C   s   d | _ g | _d S ©N)Ú_currentÚobjects©Úself© r   úP/var/www/html/env/lib/python3.10/site-packages/django/core/serializers/python.pyÚstart_serialization   s   
zSerializer.start_serializationc                 C   s   d S r   r   r   r   r   r   Úend_serialization   s   zSerializer.end_serializationc                 C   s
   i | _ d S r   )r	   ©r   Úobjr   r   r   Ústart_object   s   
zSerializer.start_objectc                 C   s   | j  |  |¡¡ d | _d S r   )r
   ÚappendÚget_dump_objectr	   r   r   r   r   Ú
end_object   s   
zSerializer.end_objectc                 C   s@   dt |jƒi}| jrt|dƒs|  ||jj¡|d< | j|d< |S )NÚmodelÚnatural_keyÚpkÚfields)ÚstrÚ_metaÚuse_natural_primary_keysÚhasattrÚ_value_from_fieldr   r	   )r   r   Údatar   r   r   r   "   s
   
zSerializer.get_dump_objectc                 C   s    |  |¡}t|ƒr|S | |¡S r   )Úvalue_from_objectr   Úvalue_to_string)r   r   ÚfieldÚvaluer   r   r   r   )   s   
zSerializer._value_from_fieldc                 C   s   |   ||¡| j|j< d S r   )r   r	   Úname)r   r   r#   r   r   r   Úhandle_field0   s   zSerializer.handle_fieldc                 C   sP   | j rt|jjdƒrt||jƒ}|r| ¡ }n	d }n|  ||¡}|| j|j< d S )Nr   )	Úuse_natural_foreign_keysr   Úremote_fieldr   Úgetattrr%   r   r   r	   )r   r   r#   Úrelatedr$   r   r   r   Úhandle_fk_field3   s   ÿ
zSerializer.handle_fk_fieldc                    sz   |j jjjr;ˆjrt|j jdƒrdd„ ‰ n‡fdd„‰ t|di ƒ |j	t||j	ƒ 
¡ ¡}‡ fdd„|D ƒˆj|j	< d S d S )Nr   c                 S   s   |   ¡ S r   )r   ©r$   r   r   r   Ú	m2m_valueF   s   z.Serializer.handle_m2m_field.<locals>.m2m_valuec                    s   ˆ   | | jj¡S r   )r   r   r   r,   r   r   r   r-   K   s   Ú_prefetched_objects_cachec                    s   g | ]}ˆ |ƒ‘qS r   r   )Ú.0r*   )r-   r   r   Ú
<listcomp>R   s    z/Serializer.handle_m2m_field.<locals>.<listcomp>)r(   Úthroughr   Úauto_createdr'   r   r   r)   Úgetr%   Úiteratorr	   )r   r   r#   Úm2m_iterr   )r-   r   r   Úhandle_m2m_field@   s   ÿ
þïzSerializer.handle_m2m_fieldc                 C   s   | j S r   )r
   r   r   r   r   ÚgetvalueT   s   zSerializer.getvalueN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úinternal_use_onlyr   r   r   r   r   r   r&   r+   r6   r7   r   r   r   r   r      s    r   F)ÚusingÚignorenonexistentc                k   s‚  � |  dd¡}i }| D �]2}zt|d ƒ}W n tjy#   |r"Y q‚ w i }d|v rVz|jj | d¡¡||jjj< W n t	yU }	 ztj 
|	|d | d¡d¡‚d}	~	ww i }
i }||vrjdd„ |j ¡ D ƒ||< || }|d  ¡ D ]º\}}|r||vrqt|j |¡}|jrÇt|jtjƒrÇz
t ||||¡}W n tjy¶ }	 ztj 
|	j|d | d¡|	j¡‚d}	~	ww |tjkrÁ|||< qt||
|j< qt|j�r	t|jtjƒ�r	z
t ||||¡}W n t	y÷ }	 ztj 
|	|d | d¡|¡‚d}	~	ww |tjk�r|||< qt|||j< qtz
| |¡||j< W qt t	�y. }	 ztj 
|	|d | d¡|¡‚d}	~	ww t |||¡}t ||
|¡V  qdS )	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_referencesFr   r   Nc                 S   s   h | ]}|j ’qS r   )r%   )r/   Úfr   r   r   Ú	<setcomp>y   s    zDeserializer.<locals>.<setcomp>r   )ÚpopÚ
_get_modelr   ÚDeserializationErrorr   r   Ú	to_pythonr3   ÚattnameÚ	ExceptionÚWithDataÚ
get_fieldsÚitemsÚ	get_fieldr(   Ú
isinstancer   ÚManyToManyRelÚdeserialize_m2m_valuesÚM2MDeserializationErrorÚoriginal_excÚDEFER_FIELDr%   ÚManyToOneRelÚdeserialize_fk_valueÚbuild_instanceÚDeserializedObject)Úobject_listr=   r>   Úoptionsr?   Úfield_names_cacheÚdÚModelr    ÚeÚm2m_dataÚdeferred_fieldsÚfield_namesÚ
field_nameÚfield_valuer#   Úvaluesr$   r   r   r   r   ÚDeserializerX   s’   €	
ü"ÿ€ÿÿÿÿ€ÿ


ÿÿÿ€ÿ
ÿ€ÿµrb   c              	   C   s.   zt  | ¡W S  ttfy   t d|  ¡‚w )z6Look up a model from an "app_label.model_name" string.zInvalid model identifier: '%s')r   Ú	get_modelÚLookupErrorÚ	TypeErrorr   rD   )Úmodel_identifierr   r   r   rC   ²   s   ÿÿrC   N)r;   Údjango.appsr   Údjango.core.serializersr   Ú	django.dbr   r   Údjango.utils.encodingr   r   rb   rC   r   r   r   r   Ú<module>   s    LÿZ