
v^N                 @   s   d  Z  d d l m Z d d l m Z d d l m Z m Z d d l m	 Z	 Gd d   d e j
  Z
 d 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               @   s   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   @/tmp/pip-build-8lau8j11/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   i  |  _  d  S)N)r   )r
   objr   r   r   start_object   s    zSerializer.start_objectc             C   s&   |  j  j |  j |   d  |  _ d  S)N)r	   appendget_dump_objectr   )r
   r   r   r   r   
end_object   s    zSerializer.end_objectc             C   s\   d t  | j  i } |  j s/ t | d  rK |  j | | j j  | d <|  j | d <| S)Nmodelnatural_keypkfields)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,   | j  |  } t |  r | S| j |  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 | j <d  S)N)r   r   name)r
   r   r   r   r   r   handle_field0   s    zSerializer.handle_fieldc             C   st   |  j  rN t | j j d  rN t | | j  } | rE | j   } q` d  } n |  j | |  } | |  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                s   | j  j j j r  j r? t | j  j d  r? d d     n  f d d       f d d   t | | j  j	   D  j
 | j <d  S)Nr   c             S   s
   |  j    S)N)r   )r   r   r   r   	m2m_valueA   s    z.Serializer.handle_m2m_field.<locals>.m2m_valuec                s     j  |  |  j j  S)N)r   r   r   )r   )r
   r   r   r&   D   s    c                s   g  |  ] }   |   q Sr   r   ).0r$   )r&   r   r   
<listcomp>G   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   getvalueJ   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   usingignorenonexistentFc         )   k   s  | j  d d  } i  } xl|  D]d} y t | d  } Wn$ t j k
 r_ | rX w n   Yn Xi  } d | k r y/ | j j j | j d   | | j j j <WnM t	 k
 r }	 z- t j j
 |	 | d | j d  d   WYd d }	 ~	 Xn Xi  }
 i  } | | k r)d d   | j j   D | | <| | } x$| d j   D]\ } } | re| | k reqD| j j |  } | j r6t | j t j  r6y t j | | | |  } WnV t j k
 r	}	 z3 t j j
 |	 j | d | j d  |	 j   WYd d }	 ~	 Xn X| t j k r&| | | <qV| |
 | j <qD| j rt | j t j  ry t j | | | |  } WnM t	 k
 r}	 z- t j j
 |	 | d | j d  |   WYd d }	 ~	 Xn X| t j k r| | | <qV| | | j <qDy | j |  | | j <WqDt	 k
 rU}	 z- t j j
 |	 | d | j d  |   WYd d }	 ~	 XqDXqDWt j | | |  } t j | |
 |  Vq Wd 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 Sr   )r   )r'   fr   r   r   	<setcomp>k   s   	 zDeserializer.<locals>.<setcomp>r   )pop
_get_modelr   DeserializationErrorr   r   Z	to_pythongetZattname	ExceptionZWithDataZ
get_fieldsitems	get_fieldr"   
isinstancer   ZManyToManyRelZdeserialize_m2m_valuesZM2MDeserializationErrorZoriginal_excZDEFER_FIELDr   ZManyToOneRelZdeserialize_fk_valueZbuild_instanceZDeserializedObject)object_listr0   r1   optionsr2   Zfield_names_cachedZModelr   eZm2m_dataZdeferred_fieldsfield_names
field_nameZfield_valuer   valuesr   r   r   r   r   DeserializerN   s\    /; 
A;?rD   c             C   sC   y t  j |   SWn+ t t f k
 r> t j d |    Yn Xd S)z6Look up a model from an "app_label.model_name" string.zInvalid model identifier: '%s'N)r   Z	get_modelLookupError	TypeErrorr   r7   )Zmodel_identifierr   r   r   r6      s    r6   N)r/   Zdjango.appsr   Zdjango.core.serializersr   Z	django.dbr   r   Zdjango.utils.encodingr   r   rD   r6   r   r   r   r   <module>   s   AH