o
    ˷eZ                     @   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   U/var/www/ideatree/venv/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rt|jtjrz
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