ó
TR¹Nc           @   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	 m
 Z
 d e j f d „  ƒ  YZ d „  Z d	 „  Z d
 S(   s¸   
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.
iÿÿÿÿ(   t   settings(   t   base(   t   modelst   DEFAULT_DB_ALIAS(   t   smart_unicodet   is_protected_typet
   Serializerc           B   s\   e  Z d  Z e Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z d „  Z RS(	   s8   
    Serializes a QuerySet to basic Python objects.
    c         C   s   d  |  _ g  |  _ d  S(   N(   t   Nonet   _currentt   objects(   t   self(    (    sK   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/python.pyt   start_serialization   s    	c         C   s   d  S(   N(    (   R
   (    (    sK   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/python.pyt   end_serialization   s    c         C   s   i  |  _  d  S(   N(   R   (   R
   t   obj(    (    sK   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/python.pyt   start_object   s    c         C   sP   |  j  j i t | j ƒ d 6t | j ƒ  d t ƒd 6|  j d 6ƒ d  |  _ d  S(   Nt   modelt   strings_onlyt   pkt   fields(   R	   t   appendR   t   _metat   _get_pk_valt   TrueR   R   (   R
   R   (    (    sK   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/python.pyt
   end_object   s
    c         C   sK   | j  | ƒ } t | ƒ r. | |  j | j <n | j | ƒ |  j | j <d  S(   N(   t   _get_val_from_objR   R   t   namet   value_to_string(   R
   R   t   fieldt   value(    (    sK   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/python.pyt   handle_field%   s    c         C   s§   t  | | j ƒ } | d  k	 r“ |  j rE t | d ƒ rE | j ƒ  } q“ | j j | j j	 j k ro | j
 ƒ  } q“ t t  | | j j ƒ d t ƒ} n  | |  j | j <d  S(   Nt   natural_keyR   (   t   getattrR   R   t   use_natural_keyst   hasattrR   t   relt
   field_nameR   R   R   R   R   R   (   R
   R   R   t   related(    (    sK   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/python.pyt   handle_fk_field/   s    $c         C   s‡   | j  j j j rƒ |  j r< t | j  j d ƒ r< d „  } n	 d „  } g  t | | j ƒ j	 ƒ  D] } | | ƒ ^ q^ |  j
 | j <n  d  S(   NR   c         S   s
   |  j  ƒ  S(   N(   R   (   R   (    (    sK   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/python.pyt   <lambda>@   s    c         S   s   t  |  j ƒ  d t ƒS(   NR   (   R   R   R   (   R   (    (    sK   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/python.pyR&   B   s    (   R"   t   throughR   t   auto_createdR    R!   t   toR   R   t   iteratorR   (   R
   R   R   t	   m2m_valueR$   (    (    sK   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/python.pyt   handle_m2m_field=   s    	c         C   s   |  j  S(   N(   R	   (   R
   (    (    sK   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/python.pyt   getvalueF   s    (   t   __name__t
   __module__t   __doc__R   t   internal_use_onlyR   R   R   R   R   R%   R,   R-   (    (    (    sK   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/python.pyR      s   					
			c         +   s¬  | j  d t ƒ ‰ t j ƒ  x‰|  D]} t | d ƒ } i | j j j | d ƒ | j j j 6} i  } x"| d j	 ƒ  D]\ } } t
 | t ƒ r» t | | j d t j ƒ d t ƒ} n  | j j | ƒ ‰  ˆ  j rPt
 ˆ  j t j ƒ rPt ˆ  j j j d ƒ r‡  ‡ f d †  } n ‡  f d	 †  } g  | D] }	 | |	 ƒ ^ q.| ˆ  j <qy ˆ  j rst
 ˆ  j t j ƒ rs| d k	 rct ˆ  j j j d ƒ r2t | d
 ƒ rûˆ  j j j j ˆ ƒ j | Œ  }
 t |
 ˆ  j j ƒ } ˆ  j j j j j r"| j } q"n' ˆ  j j j j ˆ  j j ƒ j | ƒ } | | ˆ  j <qpˆ  j j j j ˆ  j j ƒ j | ƒ | ˆ  j <q‰d | ˆ  j <qy ˆ  j | ƒ | ˆ  j <qy Wt j | |   | ƒ Vq# Wd S(   sÃ   
    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
    t   usingR   R   R   t   encodingR   t   get_by_natural_keyc            sT   t  |  d ƒ r1 ˆ  j j j j ˆ ƒ j |  Œ  j St ˆ  j j j j j	 |  ƒ ƒ Sd  S(   Nt   __iter__(
   R!   R"   R)   t   _default_managert
   db_managerR4   R   R   R   t	   to_python(   R   (   R   t   db(    sK   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/python.pyt   m2m_convertb   s    "c            s   t  ˆ  j j j j j |  ƒ ƒ S(   N(   R   R"   R)   R   R   R8   (   t   v(   R   (    sK   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/python.pyR&   h   s    R5   N(    t   popR   R   t   get_appst
   _get_modelR   R   R8   t   attnamet	   iteritemst
   isinstancet   strR   t   getR    t   DEFAULT_CHARSETR   t	   get_fieldR"   t   ManyToManyRelR!   R)   R6   R   t   ManyToOneRelR   R7   R4   R   R#   R   t   DeserializedObject(   t   object_listt   optionst   dt   Modelt   datat   m2m_dataR#   t   field_valueR:   R   R   R   (    (   R   R9   sK   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/python.pyt   DeserializerI   s:    
)')!'1c         C   s\   y t  j |  j d ƒ Œ  } Wn t k
 r5 d } n X| d k rX t j d |  ƒ ‚ n  | S(   sK   
    Helper to look up a model from an "app_label.module_name" string.
    t   .u   Invalid model identifier: '%s'N(   R   t	   get_modelt   splitt	   TypeErrorR   R   t   DeserializationError(   t   model_identifierRL   (    (    sK   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/python.pyR>   „   s    
N(   R0   t   django.confR    t   django.core.serializersR   t	   django.dbR   R   t   django.utils.encodingR   R   R   RP   R>   (    (    (    sK   /home/panlixing/Python_Projects/gaeseries/django/core/serializers/python.pyt   <module>   s   =	;