B
    ©0H[˜  ã               @   sr   d Z ddlm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.
é    )ÚOrderedDict)Ú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   úbC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\django\core\serializers\python.pyÚstart_serialization   s    zSerializer.start_serializationc             C   s   d S )Nr   )r   r   r   r   Úend_serialization   s    zSerializer.end_serializationc             C   s   t ƒ | _d S )N)r   r	   )r   Úobjr   r   r   Ústart_object   s    zSerializer.start_objectc             C   s   | j  |  |¡¡ d | _d S )N)r
   ÚappendÚget_dump_objectr	   )r   r   r   r   r   Ú
end_object   s    zSerializer.end_objectc             C   sF   t dt|jƒfgƒ}| jr$t|dƒs8|  ||jj¡|d< | j|d< |S )NÚmodelÚnatural_keyÚpkÚfields)r   ÚstrÚ_metaZ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 )N)Zvalue_from_objectr   Zvalue_to_string)r   r   ÚfieldÚvaluer   r   r   r   *   s    
zSerializer._value_from_fieldc             C   s   |   ||¡| j|j< d S )N)r   r	   Úname)r   r   r   r   r   r   Úhandle_field1   s    zSerializer.handle_fieldc             C   sP   | j r4t|jjdƒr4t||jƒ}|r.| ¡ }q@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_field4   s    
zSerializer.handle_fk_fieldc                s`   |j jjjr\ˆjr*t|j jdƒr*dd„ ‰ n‡fdd„‰ ‡ fdd„t||jƒ 	¡ D ƒˆj
|j< d S )Nr   c             S   s   |   ¡ S )N)r   )r   r   r   r   Ú	m2m_valueB   s    z.Serializer.handle_m2m_field.<locals>.m2m_valuec                s   ˆ   | | jj¡S )N)r   r   r   )r   )r   r   r   r'   E   s    c                s   g | ]}ˆ |ƒ‘qS r   r   )Ú.0r%   )r'   r   r   ú
<listcomp>H   s    z/Serializer.handle_m2m_field.<locals>.<listcomp>)r#   Zthroughr   Zauto_createdr"   r   r   r$   r    Úiteratorr	   )r   r   r   r   )r'   r   r   Úhandle_m2m_field?   s
    
zSerializer.handle_m2m_fieldc             C   s   | j S )N)r
   )r   r   r   r   ÚgetvalueK   s    zSerializer.getvalueN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Zinternal_use_onlyr   r   r   r   r   r   r!   r&   r+   r,   r   r   r   r   r      s   r   F)ÚusingÚignorenonexistentc            +   sl  i }�x`| D �]V}yt |d ƒ}W n  tjk
rB   |r<wn‚ Y nX i }d|kr²y"|jj | d¡¡||jjj< W n> tk
r° } z tj 	||d | d¡d¡‚W dd}~X Y nX i }	||krÖdd„ |j 
¡ D ƒ||< || }
�xf|d  ¡ D �]T\}}|�r
||
k�r
qî|j |¡}|j�rÖt|jtjƒ�rÖ|jj‰ tˆ jdƒ�rT‡ ‡fdd	„}n‡ fd
d	„}y2g |	|j< x"|D ]}|	|j  ||ƒ¡ �qrW W n@ tk
�rÒ } z tj 	||d | d¡|¡‚W dd}~X Y nX qî|j�rît|jtjƒ�rî|jj‰ |dk	�râyžˆ j}|jj}t|dƒ�r„t|dƒ�rft|tƒ�sf| ˆ¡j|Ž }t||jjƒ}ˆ jjj�rx|j}nˆ j |¡ |¡}|||j< nˆ j |¡ |¡||j< W n@ tk
�rÞ } z tj 	||d | d¡|¡‚W dd}~X Y nX n
d||j< qîy| |¡||j< W qî tk
�rB } z tj 	||d | d¡|¡‚W dd}~X Y qîX qîW t ||ˆ¡}t ||	¡V  qW 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
    r   r   Nc             S   s   h | ]
}|j ’qS r   )r    )r(   Úfr   r   r   ú	<setcomp>j   s    zDeserializer.<locals>.<setcomp>r   Úget_by_natural_keyc                s:   t | dƒr(t| tƒs(ˆ j ˆ¡j| Ž jS ˆ jj | ¡S d S )NÚ__iter__)	r   Ú
isinstancer   Ú_default_managerÚ
db_managerr5   r   r   Ú	to_python)r   )r   r1   r   r   Úm2m_convertz   s    z!Deserializer.<locals>.m2m_convertc                s   ˆ j j | ¡S )N)r   r   r:   )Úv)r   r   r   r;   €   s    r6   )Ú
_get_modelr   ÚDeserializationErrorr   r   r:   ÚgetZattnameÚ	ExceptionZWithDataZ
get_fieldsÚitemsÚ	get_fieldr#   r7   r   ZManyToManyRelr   r   r8   r    r   ZManyToOneRelÚ
field_namer   r9   r5   r$   Zbuild_instanceZDeserializedObject)Úobject_listr1   r2   ÚoptionsZfield_names_cacheÚdZModelr   ÚeZm2m_dataÚfield_namesrC   Zfield_valuer   r;   r   Zdefault_managerr   r   r   )r   r1   r   ÚDeserializerO   sr    ".

0
02rI   c          	   C   s6   y
t  | ¡S  ttfk
r0   t d|  ¡‚Y nX dS )z6Look up a model from an "app_label.model_name" string.zInvalid model identifier: '%s'N)r   Z	get_modelÚLookupErrorÚ	TypeErrorr   r>   )Zmodel_identifierr   r   r   r=   ®   s    
r=   N)r0   Úcollectionsr   Zdjango.appsr   Zdjango.core.serializersr   Z	django.dbr   r   Zdjango.utils.encodingr   r   rI   r=   r   r   r   r   Ú<module>   s   A_