
    (\iM}                    f   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlZd dlmZ d dlmZ d dlmZ d d	lmZmZmZmZmZmZmZ d d
lmZmZmZmZmZm Z  d dl!m"Z"m#Z#m$Z$m%Z%m&Z& d dl'm(Z( d dl)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1m2Z2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9m:Z: d dl;m<Z<m=Z= d dl>m?Z?m@Z@mAZAmBZBmCZC d dlDmEZEmFZF d dlGmHZH d dlImJZJ d dlKmLZLmMZM d dlNmOZP  G d d      ZQ eQ       ZRd ZSd ZT G d d eU      ZV G d! d"      ZW G d# d$      ZX G d% d&eEeV'      ZYd-d(ZZd) Z[d* Z\d+ Z]d,e]_^        y).    N)defaultdict)partialmethod)chain)sync_to_async)apps)settings)checks)NON_FIELD_ERRORSFieldDoesNotExist
FieldErrorMultipleObjectsReturnedObjectDoesNotExistObjectNotUpdatedValidationError)DJANGO_VERSION_PICKLE_KEYDatabaseError
connectionconnectionsroutertransaction)NOT_PROVIDEDExpressionWrapperIntegerFieldMaxValue
LOOKUP_SEP)CASCADE	Collector)DatabaseDefault)CompositePrimaryKey)ForeignObjectRelOneToOneFieldlazy_related_operationresolve_relation)Coalesce)Manager)Options)FQ)class_prepared	post_init	post_savepre_initpre_save)
AltersDatamake_model_tuple)	force_str)make_hashable)capfirstget_text_list)gettext_lazyc                       e Zd Zd Zd Zy)Deferredc                      yNz<Deferred field> selfs    e/home/devuser/fomin/mqttuser/mqtt_project/myenv/lib/python3.12/site-packages/django/db/models/base.py__repr__zDeferred.__repr__=       !    c                      yr:   r;   r<   s    r>   __str__zDeferred.__str__@   r@   rA   N)__name__
__module____qualname__r?   rC   r;   rA   r>   r8   r8   <   s    ""rA   r8   c                 @    t        | |||j                  d| d      S )z
    Create exception subclass. Used by ModelBase below.

    The exception is created in a way that allows it to be pickled, assuming
    that the returned exception class will be added as an attribute to the
    'attached_to' class.
    .)rE   rF   )typerF   )namebasesmoduleattached_tos       r>   subclass_exceptionrN   G   s-      '2'?'?F	
 rA   c                 J    t        j                  |        xr t        | d      S )Ncontribute_to_class)inspectisclasshasattr)values    r>   _has_contribute_to_classrU   Y   s!    u%%O'%9N*OOrA   c                   N     e Zd ZdZ fdZd Zd Zed        Zed        Z	 xZ
S )	ModelBasezMetaclass for all models.c                    t         '|   }|D cg c]  }t        |t              s| }}|s || |||      S |j	                  d      }d|i}	|j	                  dd       }
|
|
|	d<   |j	                  dd       }i }|j                         D ]  \  }}t        |      r|||<   ||	|<     || |||	fi |}t        |dd      }|xs t        |dd       }t        |dd       }d }t        j                  |      }t        |dd       "||st        d|d	|d
      |j                  }|j                  dt        ||             |s	|j                  dt        dt        d |D              xs t         f||             |j                  dt        dt        d |D              xs t"        f||             |j                  dt        dt        d |D              xs t$        t&        f||             |rZ|j(                  sNt+        |d      s|j,                  |j.                  _        t+        |d      s|j0                  |j.                  _        |j.                  j2                  }|r)|r'|j4                  rt7        |d|j4                  d      |j                         D ]  \  }}|j                  ||        t9        |j.                  j:                  |j.                  j<                  |j.                  j>                        }|D ch c]  }|j@                   }}|rd }|D cg c]  }t+        |d      s| c}D ]|  }|j.                  j(                  r%|j.                  jB                  rt7        d|z        >||}C|j.                  jD                  |j.                  jD                  uspt7        d|z         |t7        d|z        |j.                  jG                  |       |j.                  jD                  |j.                  _"        n||j.                  _"        i }tI        |g|      D ]  }t+        |d      s||k7  r|j.                  j(                  s,|j.                  j:                  D ]X  }t        |tJ              s|jL                  jN                  s+tQ        ||jL                  jR                        }||tU        |      <   Z  tW               }|jY                         D ]K  }||vst+        |d      s|j[                  |j\                         0|j.                  j:                  |j.                  j<                  z   } |j.                  j(                  s| D ]T  }|j@                  |v r)t_        d|j@                  d|d|j`                  d	      |jc                  |j@                         V |j.                  jD                  }tU        |      }!|!|v r||!   }ns|sod|j.                  jd                  z  }"tK        |tf        |"dd      }|"|v rt_        d|"d |d!|j`                  d"      t+        ||"      s|j                  |"|       nd }||j.                  jh                  |<   n|j.                  jh                  jk                         }#| D ]  }|j@                  |vs|j@                  |j\                  vs+|j@                  |vs:tk        jl                  |      }$|j                  |j@                  |$       |jn                  sx|#j                         D ]  \  }}%||%k(  s|$|#|<     |j.                  jh                  j[                  |#       |j.                  j>                  D ]  }|j@                  |v r@|j.                  j(                  r(t_        d|j@                  d|d|j`                  d	      |j@                  |j\                  vsj|j@                  |vsytk        jl                  |      }|j.                  j(                  sd|_8        |j                  |j@                  |        N |j.                  jr                  D &cg c]  }&tk        jl                  |&       c}&|j.                  _9        |rd|_        ||_:        |S |jw                          |j.                  j                  jy                  |j.                  jz                  |       |S c c}w c c}w c c}w c c}&w )#NrE   __classcell__MetaabstractF_meta	app_labelzModel class rH   zU doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.DoesNotExistc              3   x   K   | ]2  }t        |d       r$|j                  j                  s|j                   4 ywr\   N)rS   r\   r[   r^   .0xs     r>   	<genexpr>z$ModelBase.__new__.<locals>.<genexpr>   s2      "1g.qww7G7G    8:)rM   r   c              3   x   K   | ]2  }t        |d       r$|j                  j                  s|j                   4 ywr`   )rS   r\   r[   r   ra   s     r>   rd   z$ModelBase.__new__.<locals>.<genexpr>   s4      "1g.qww7G7G 11re   
NotUpdatedc              3   x   K   | ]2  }t        |d       r$|j                  j                  s|j                   4 ywr`   )rS   r\   r[   rg   ra   s     r>   rd   z$ModelBase.__new__.<locals>.<genexpr>   s2      "1g.qww7G7G re   orderingget_latest_byz! cannot proxy the swapped model ''.zOAbstract base class containing model fields not permitted for proxy model '%s'.zAProxy model '%s' has more than one non-abstract model base class.z6Proxy model '%s' has no non-abstract model base class.zLocal field z
 in class z5 clashes with field of the same name from base class z%s_ptrT)	on_deleterJ   auto_createdparent_linkzAuto-generated field 'z' in class z for parent_link to base class z. clashes with declared field of the same name.)>super__new__
isinstancerW   popitemsrU   getattrr   get_containing_app_configRuntimeErrorlabeladd_to_classr(   rN   tupler   r   r   r   r[   rS   ri   r\   rj   proxyswapped	TypeErrorr   local_fieldslocal_many_to_manyprivate_fieldsrJ   fieldsconcrete_modelsetup_proxyreversedr#   remote_fieldrn   r%   modelr1   setmroupdate__dict__r   rD   add
model_namer   parentscopydeepcopy
one_to_onemti_inheritedindexesrZ   _prepareregister_modelr]   )(clsrJ   rK   attrskwargs	super_newbr   rL   	new_attrs	classcell	attr_metacontributable_attrsobj_nameobj	new_classr[   meta	base_metar]   
app_configis_proxy
new_fieldsffield_namesbaseklsparentparent_linksfieldrelatedinherited_attributesparent_fieldsbase_key	attr_namebase_parents	new_fieldrn   idx	__class__s(                                          r>   rp   zModelBase.__new__a   s   GO	 $@z!Y'?1@@S$u55 <(!6*	IIot4	 )2Io&IIfd+	 !"[[] 	*MHc',03#H-&)	(#		*
 c4	DVD	9j%8<GIvt<Iw5		 33F;
4d+3!& .4T;  ',,	wi(@A"""" !(  -
 +, )
 "")"- !(  2
 01 )
 """  !(  9 )-8 )" !3!3 tZ0/8/A/AIOO,t_54=4K4KIOO1??(( 	i&7&7=A9CTCTU  1668 	2MHc""8S1	2 OO((OO..OO**


 (22!qvv22 D*1K3WS'5J3K <<((||**'>@DE 
 !<!D\\00

8Q8QQ#!#'(   |LtS  OO''--1ZZ-F-FIOO*-6IOO* i2'23 	DD4)y )<)<00 De]38J8J8V8V.y%:L:L:R:RSG>CL!1'!:;D	D  #uMMO f	>D7"'$*@ %++DMM: JJ33djj6S6SSM::&& + =Ezz[0( !&

 $ $  -00<= zz00+D1|+(2E! (4::+@+@ @I)")&%)$(E !K/(
 !* $ $	 	 #9i8!..y%@ E05	''-#zz11668 + EE

+5!JJi.@.@@!JJ.BB$(MM%$8	!..uzz9E !++7C7I7I7K E 3#(K#7;DL$8EE  ''..|< 22 >::,::..( !&

 $ $  JJi&8&88

*>> MM%0E::...2+**5::u='>gf	>V +4//*A*A#
#&DMM##
	  "'I&IN++IOO,E,EyQ An 3
 Lj#
s"   ccc#c#5c#c(c                 Z    t        |      r|j                  | |       y t        | ||       y N)rU   rP   setattr)r   rJ   rT   s      r>   rx   zModelBase.add_to_class  s&    #E*%%c40Cu%rA   c                    | j                   }|j                  |        |j                  rt        | j                  d      | _        t        | j                  d      | _        |j                  j                  r3|j                  }|j                  j                  }t        t        | |       | j                  7| j                  ddj                  d |j                  D              d| _        t        j                   j#                  |j$                        }|rt'        | d	|       |j(                  sWt+        d
 |j                  D              rt-        d| j                  z        t/               }d|_        | j3                  d|       | j                   j4                  D ]   }|j6                  r|j9                  |        " t;        j<                  |        y)z7Create some methods once self._meta has been populated.T)is_nextFN(, c              3   4   K   | ]  }|j                     y wr   rJ   rb   r   s     r>   rd   z%ModelBase._prepare.<locals>.<genexpr>  s     6Q!&&6   )get_absolute_urlc              3   :   K   | ]  }|j                   d k(    yw)objectsNr   r   s     r>   rd   z%ModelBase._prepare.<locals>.<genexpr>  s     <1166Y&<s   zOModel %s must specify a custom Manager, because it has a field named 'objects'.r   )sender)r\   r   order_with_respect_tor   _get_next_or_previous_in_orderget_next_in_orderget_previous_in_orderr   r   r$   make_foreign_order_accessors__doc__rD   joinr   r   ABSOLUTE_URL_OVERRIDESgetlabel_lowerr   managersany
ValueErrorr'   rm   rx   r   rJ   set_name_with_modelr+   send)r   optswrtremoteget_absolute_url_overridemanagerindexs          r>   r   zModelBase._prepare  s   yyc%%$122D%C! )622E)C% ))6600))//&'CS&Q ;;		6$++66CK
 %-$C$C$G$G%
! %C+-FG}}<<< -/2||<  iG#'G Y0
 YY&& 	/E::))#.	/ 	3'rA   c                 .    | j                   j                  S r   )r\   base_managerr   s    r>   _base_managerzModelBase._base_manager  s    yy%%%rA   c                 .    | j                   j                  S r   )r\   default_managerr   s    r>   _default_managerzModelBase._default_manager  s    yy(((rA   )rD   rE   rF   r   rp   rx   r   propertyr   r   rY   r   s   @r>   rW   rW   ^   s@    #dL	&5(n & & ) )rA   rW   c                       e Zd ZddZy)ModelStateFieldsCacheDescriptorNc                      || S i x}|_         |S r   )fields_cache)r=   instancer   ress       r>   __get__z'ModelStateFieldsCacheDescriptor.__get__  s    K&((h#
rA   r   )rD   rE   rF   r   r;   rA   r>   r   r     s    rA   r   c                   &    e Zd ZdZdZdZ e       Zy)
ModelStatezStore model instance state.NT)rD   rE   rF   r   dbaddingr   r   r;   rA   r>   r   r     s    %	B
 F24LrA   r   c                   ,    e Zd Z fdZed        Zd Zd Zd Zd Z	d Z
d Zd	 ZdFdZd Z eee      ZdFdZd ZdGdZdGdZd Zddd
d
ddZde_        ddd
d
ddZde_        ed        Z	 	 	 	 	 dHdZde_        	 dFdZ	 	 	 	 	 	 dIdZd Zd Zd ZdFdZ dJdZ!de!_        dJd Z"de"_        d! Z#d" Z$d# Z%dFd$Z&d% Z'd& Z(dFd'Z)dJd(Z*d) Z+d* Z,d+ Z-d, Z.d- Z/dFd.Z0dKd/Z1dFd0Z2ed1        Z3ed2        Z4ed3        Z5ed4        Z6ed5        Z7ed6        Z8ed7        Z9ed8        Z:ed9        Z;ed:        Z<ed;        Z=ed<        Z>ed=        Z?ed>        Z@ed?        ZAed@        ZBedA        ZCedB        ZDedC        ZEedD        ZFedE        ZG xZHS )LModelc                    | j                   }| j                  }t        }t        }|j                  rt        d      t        j                  |||       t               | _	        t        |      t        |j                        kD  rt        d      |sCt        |j                        }t        ||      D ]  \  }}	||u r || |	j                  |         nt        |j                         }t        ||      D ]i  \  }}	||u r || |	j                  |       |j#                  |	j$                  t&              t&        usFt        |j(                   d|	j$                   d       |D ]  }	d}
|	j*                  |	j,                  r|rVt/        |	j0                  t2              r	 |j#                  |	j$                        }d}
n-	 |j#                  |	j                        }n|	j7                         }|
r|us || |	j$                  |       |us || |	j                  |        |r|j8                  }d}|j;                         D ]:  \  }}||v r||us || ||       	 |j=                  |       ||us1 || ||       < |r2d	jA                  d
 |D              }t        |jB                   d|       tD        |           tI        j                  ||        y # t4        $ r@ 	 |j#                  |	j                        }n# t4        $ r |	j7                         }Y nw xY wY 6w xY w# t4        $ r |	j7                         }Y Vw xY w# t>        $ r
 ||fz  }Y w xY w)Nz'Abstract models cannot be instantiated.)r   argsr   z'Number of args exceeds number of fieldsz8() got both positional and keyword arguments for field 'rk   FTr;   r   c              3   2   K   | ]  }t        |        y wr   repr)rb   ns     r>   rd   z!Model.__init__.<locals>.<genexpr>M  s     ,IT!W,I   z%() got unexpected keyword arguments: )r   r   )%r   r\   r   DEFERREDr[   r|   r.   r   r   _statelenconcrete_fields
IndexErroriterzipattnamer   rr   rJ   r   rF   column	generatedrq   r   r"   KeyErrorget_default_property_namesrs   	get_fieldr   r   rD   ro   __init__r,   )r=   r   r   r   r   _setattr	_DEFERREDfields_itervalr   is_related_objectrel_objproperty_names
unexpectedproprT   unexpected_namesr   s                    r>   r  zModel.__init__  sQ   nnzz	==EFFStF; !l t9s4//00FGGt334K
 "$4 3
U)#u}}c23 t{{+K!$4 
U)#u}}c2::ejj,7|K#++, -88=

|2G  ! '	7E %||#ue002BC
6"(**UZZ"8,0)2$jj7 '') 
 )+T5::w7i'T5==#6O'	7R !11NJ%||~ 8e >)I- tU38t, !	1$T478 #'99,Ij,I#I ||n$I'(*  	cD1m $ 66 #)**U]]";C' 6"'"3"3"5C66 $ 2
 $//12@ - ."tg-
.sZ   K>L$M	L!"K>=L!>LL!LL! L!$M MMMc                 J   t        |      t        | j                  j                        k7  rKt        |      }| j                  j                  D cg c]!  }|j                  |v rt        |      nt        # }} | | }d|j                  _        ||j                  _	        |S c c}w NF)
r   r\   r   r   r   nextr   r   r   r   )r   r   r   valuesvalues_iterr   news          r>   from_dbzModel.from_dbU  s    v;#cii7788v,K 22 &'YY+%=[!8KF  6l!




s   &B c                 <    d| j                   j                  d| dS )N<z: >)r   rD   r<   s    r>   r?   zModel.__repr__b  s    !^^44d;;rA   c                 N    | j                   j                  d| j                  dS )Nz	 object (r   )r   rD   pkr<   s    r>   rC   zModel.__str__e  s    #'>>#:#:DGGDDrA   c                     t        |t              st        S | j                  j                  |j                  j                  k7  ry| j
                  }|| |u S ||j
                  k(  S r  )rq   r   NotImplementedr\   r   r  )r=   othermy_pks      r>   __eq__zModel.__eq__h  sX    %'!!::$$(B(BB=5=   rA   c                 b    | j                         st        d      t        | j                        S )Nz8Model instances without primary key value are unhashable)
_is_pk_setr|   hashr  r<   s    r>   __hash__zModel.__hash__r  s&     VWWDGG}rA   c                     | j                         }t        j                  |t        <   | j                  j
                  | j                  j                  f}t        |f|fS r   )__getstate__django__version__r   r\   r]   object_namemodel_unpickle)r=   dataclass_ids      r>   
__reduce__zModel.__reduce__w  sN      "*0*<*<&'::'')?)??{D00rA   c                    | j                   j                         }t        j                  |d         |d<   |d   j                  j                         |d   _        g }|j                         D ]2  \  }}t	        |t
              s|j                  |t        |      f       4 |r ||d<   |D ]  \  }}|j                  |        |S )z0Hook to allow choosing the attributes to pickle.r   _memoryview_attrs)	r   r   r   rs   rq   
memoryviewappendbytesrr   )r=   stater/  attrrT   s        r>   r&  zModel.__getstate__}  s    ""$))E(O4h',X'C'C'H'H'Jh$  ;;= 	?KD%%,!(($e)=>	? ):E%&0  e		$ rA   c                    |j                  t              }|rE|t        j                  k7  rNt	        j
                  d|dt        j                  dt        d       nt	        j
                  dt        d       d|v r'|j                  d      D ]  \  }}t        |      ||<    | j                  j                  |       y )Nz(Pickled model instance's Django version z$ does not match the current version rH      )
stacklevelz9Pickled model instance's Django version is not specified.r/  )r   r   r'  r(  warningswarnRuntimeWarningrr   r0  r   r   )r=   r3  pickled_versionr4  rT   s        r>   __setstate__zModel.__setstate__  s    ))$=>&"4"44 '(:(:< #  MMK
 %'$yy)<= 0e(/d0U#rA   Nc                 b    |xs | j                   }t        | |j                  j                        S r   )r\   rt   r  r   )r=   r   s     r>   _get_pk_valzModel._get_pk_val  s%    !tzztTWW__--rA   c                 &   | j                   j                  j                         D ]@  }|s|| j                   j                  k7  s t	        | |j
                  j                  |       B t	        | | j                   j                  j                  |      S r   )r\   r   r  r  r   target_fieldr   )r=   rT   rn   s      r>   _set_pk_valzModel._set_pk_val  so    ::--446 	GK{djjmm;k66>>F	G tTZZ]]22E::rA   c                 z    | j                  |      }|d u xs$ t        |t              xr t        d |D               S )Nc              3   $   K   | ]  }|d u  
 y wr   r;   r   s     r>   rd   z#Model._is_pk_set.<locals>.<genexpr>  s     1L!t)1Ls   )r>  rq   ry   r   )r=   r   pk_vals      r>   r"  zModel._is_pk_set  sC    !!$'dN N65)Lc1LV1L.L
 	
rA   c                     | j                   j                  D ch c]&  }|j                  | j                  vr|j                  ( c}S c c}w )zU
        Return a set containing names of deferred fields for this instance.
        )r\   r   r   r   )r=   r   s     r>   get_deferred_fieldszModel.get_deferred_fields  sB     ZZ//
yy- II
 	
 
s   +Ac           	         |i | _         nmt        | dd      }t        |      }|j                         D ]  }||v s||= |j	                  |        |syt        d |D              rt        dt        z        |,d| i}| j                  j                  j                  ||      }n||j                  |      }|j                  | j                        }| j                         }| |j                  | }nK|rI |j                  | j                   j"                  D 	ch c]  }	|	j$                  |vr|	j$                   c}	 }|j'                         }
|
j                         }| j                   j(                  D ]  }|j$                  |v r|j*                  r+t-        | |j$                  t        |
|j$                               |j.                  sV|j1                  |
      r"|j3                  | |j5                  |
             |j1                  |       s|j7                  |         | j                   j8                  D ]6  }||j:                  |v s|j1                  |       s&|j7                  |        8 | j                   j<                  D ]C  }||j:                  |v s|j.                  s!|j1                  |       s3|j7                  |        E |
j>                  j@                  | j>                  _         yc c}	w )	aU  
        Reload field values from the database.

        By default, the reloading happens from the database this instance was
        loaded from, or by the read router if this instance wasn't loaded from
        any database. The using parameter will override the default.

        Fields can be used to specify which fields to reload. The fields
        should be an iterable of field attnames. If fields is None, then
        all non-deferred fields are reloaded.

        When accessing deferred fields of an instance, the deferred loading
        of the field will call this method.
        N_prefetched_objects_cacher;   c              3   ,   K   | ]  }t         |v   y wr   r   r   s     r>   rd   z(Model.refresh_from_db.<locals>.<genexpr>  s     3q:?3s   zRFound "%s" in fields argument. Relations and transforms are not allowed in fields.r   )hintsr  )!rH  rt   r   r   remover   r   r   r   r   
db_managerusingfilterr  rF  onlyr\   r   r   r   r   concreter   is_relation	is_cachedset_cached_valueget_cached_valuedelete_cached_valuerelated_objectsrJ   r   r   r   )r=   rN  r   from_querysetprefetched_objects_cacher   rJ  db_instance_qsdeferred_fieldsr   db_instancenon_loaded_fieldsrels                r>   refresh_from_dbzModel.refresh_from_db  s    >-/D*'.t5PRT'U$[F )4407MM%() 3F33 13=> 
  &E NN88CCEQVCWM)//6M&---9 2240^00&9N0^00 "ZZ77yy7 IIN %((*';;=ZZ&& 	4E}} 11~~emmW[%---PQ  ??;/**41G1G1TU__T*--d3	4 ::-- 	.C#((f"4#--:M''-	.
 ZZ.. 	0E5::#7%%OOD)))$/	0 %++..Is   !K7c                 Z   K    t        | j                        |||       d {   S 7 w)N)rN  r   rX  )r   r_  )r=   rN  r   rX  s       r>   arefresh_from_dbzModel.arefresh_from_db  s1     8]4#7#78m
 
 	
 
s   "+)+c                     	 | j                   j                  |      }t        | |j                        S # t        $ r t        | |      cY S w xY w)a  
        Return the value of the field name for this instance. If the field is
        a foreign key, return the id value instead of the object. If there's
        no Field object with this name on the model, return the model
        attribute's value.

        Used to serialize a field's value (in the serializer, or form output,
        for example). Normally, you would just access the attribute directly
        and not use this method.
        )r\   r  r   rt   r   )r=   
field_namer   s      r>   serializable_valuezModel.serializable_value  sL    	-JJ((4E tU]]++ ! 	-4,,	-s   3 A
AFforce_insertforce_updaterN  update_fieldsc                   | j                  d       |xs! t        j                  | j                  |       }|r|s|rt	        d      | j
                  j                  D ch c]4  }|j                  | j                  vr|j                  du r|j                  6 }}|T|syt        |      }| j
                  j                  }|j                  |      }|rt	        ddj                  |      z        |s|r|| j                  j                  k(  r| j!                         rt#               }| j
                  j$                  }	| j
                  j                  D ]/  }
|
|	vst'        |
d	      r|j)                  |
j                         1 |j                  |      }|rt        |      }| j+                  ||||
       yc c}w )aa  
        Save the current instance. Override this in a subclass if you want to
        control the saving process.

        The 'force_insert' and 'force_update' parameters can be used to insist
        that the "save" must be an SQL insert or update (or equivalent for
        non-SQL backends), respectively. Normally, they should not be set.
        save)operation_namer   z6Cannot force both insert and updating in model saving.FNzmThe following fields do not exist in this model, are m2m fields, primary keys, or are non-concrete fields: %sr   through)rN  rf  rg  rh  ) _prepare_related_fields_for_saver   db_for_writer   r   r\   r   r   r   r   	frozenset_non_pk_concrete_field_names
differencer   r   r   r"  r   	pk_fieldsrS   r   	save_base)r=   rf  rg  rN  rh  r   deferred_non_generated_fieldsr   not_updatable_fieldsrs  r   loaded_fieldss               r>   rj  z
Model.save+  s   " 	--V-DK,,T^^dK\]UVV ZZ//)
yy-!++2F II)
% )

 $ !%m4M**AAK#0#;#;K#H # Kii 456  -'!%K

,,I33 3	)'%2KOOEMM23 (223PQM )- 8%%'	 	 	
Q)
s   !9F;Tc                \   K    t        | j                        ||||       d {   S 7 w)Nre  )r   rj  )r=   rf  rg  rN  rh  s        r>   asavezModel.asaves  s6      .]499-%%'	
 
 	
 
s   #,*,c                    |du ry|du r| fS t        |t              st        d      |D ]S  }t        |t              st        d|d      t	        | |      r/t        d|j
                   d| j
                   d       |S )	NFr;   Tz%force_insert must be a bool or tuple.zInvalid force_insert member. z must be a model subclass.z must be a base of rH   )rq   ry   r|   rW   
issubclassrF   )r   rf  members      r>   _validate_force_insertzModel._validate_force_insert  s    5 46M,.CDD" 		Ffi03F:=WX  c6*3F4G4G3H I"//03 		 rA   c           	          |xs! t        j                  | j                  |       }|r|s|rJ ||sJ | j                  x}}|j                  j                  r|j                  j
                  }|j                  }|j                  st        j                  || |||       |j                  rt        j                  |d      }	nt        j                  |      }	|	5  d}
|s%| j                  |      }| j                  ||||      }
| j                  |||xs |
|||      }ddd       || j                   _        d| j                   _        |j                  st'        j                  ||  |||       yy# 1 sw Y   UxY w)av  
        Handle the parts of saving which should be done only once per save,
        yet need to be done in raw saves, too. This includes some sanity
        checks and signal sending.

        The 'raw' argument is telling save_base not to save any parent
        models and not to do any changes to the values before save. This
        is used by fixture loading.
        rl  N)r   r   rawrN  rh  F)rN  	savepoint)rN  )r   r   createdrh  r  rN  )r   ro  r   r\   rz   r   rm   r/   r   r   r   atomicmark_for_rollback_on_errorr}  _save_parents_save_tabler   r   r   r-   )r=   r  rf  rg  rN  rh  r   originr   context_managerparent_insertedupdateds               r>   rt  zModel.save_base  su   " K,,T^^dK lmEE$55~~%f99??))**Cyy  MM+ <<)00uNO)DD5QO 	#O#::<H"&"4"4|# &&/G	" "   NN$+ !-	 	s   AE44E=c           
         |j                   }d}|i }|j                  j                         D ]8  \  }}	|	rt        | |j                   j                  j
                        Ut        | |	j
                        ?t        | |j                   j                  j
                  t        | |	j
                               |j                  |      x}
C| j                  |||||      }| j                  ||||xs t        ||            }|sd}|||<   n|
sd}|	st        | |	j
                  | j                  |j                                |	j                  |       s(|	j                  |        ; |S )z3Save all the parents of cls using values from self.F)r   rN  rh  rf  updated_parents)r   rN  rh  rf  T)r\   r   rs   rt   r  r   r   r   r  r  r{  r>  rS  rV  )r=   r   rN  rh  rf  r  r   insertedr   r   parent_updatedr  r  s                r>   r  zModel._save_parents  s_    yy" O!\\//1 $	4MFE D&,,//"9"9:BD%--0<flloo55wtU]]7ST"1"5"5f"==F"&"4"4"/!-$3 #5 # **"/!0!TJv|4T	 +  #H*1'#emmT-=-=fll-KL ??4(--d3I$	4J rA   c           
         |j                   }|j                  }|j                  D 	cg c]  }	|	|vr|	j                  s|	 }
}	|r+|
D 	cg c]   }	|	j                  |v s|	j
                  |v r|	" }
}	| j                  |      s<|j                  j                  |       }t        | |j                  j
                  |       | j                  |      }|s|s|rt        d      d}|s8|s6|s4| j                  j                  rt        d |j                  D              rd}|rI|sF|j                  j                  |      }|
D 	cg c]/  }	|	d|rt!        | |	j
                        n|	j#                  | d      f1 }}	|xs |}| j%                  |      }|j                  D 	cg c]+  }	|	j                  r|	j&                  j)                  |
      r|	- }}	|D ]5  \  }}}||j                  |v st+        |d      s%|j-                  |       7 | j/                  |||||||      }t1        |      x}r| j3                  |d   |       n&|r| j5                  d      |r| j5                  d	      |s|j6                  r|j6                  }|j9                  |       } |j                  j                  |      j:                  di |j=                  t?        tA        tC        d
      tE        d      z   tG                     tE        d                  d   | _$        |j                  D 	cg c]   }	|	j                  s|s|	|jJ                  ur|	" }}	tM        |jN                        }tP        |   jR                  jT                  }|D ]  }|rt!        | |j
                        n|j#                  | d      }t+        |d      r||vs>|j-                  |       P|jV                  s]|r`|r||jJ                  u rq|jY                  |        | j[                  |j                  ||||      }|r| j3                  |d   |       |S c c}	w c c}	w c c}	w c c}	w c c}	w )zp
        Do the heavy-lifting involved in saving. Update or insert the data
        for a single table.
        z5Cannot force an update in save() with no primary key.Fc              3   `   K   | ]&  }|j                         xs |j                          ( y wr   )has_defaulthas_db_defaultr   s     r>   rd   z$Model._save_table.<locals>.<genexpr>8  s'     RaAMMO9q'7'7'99Rs   ,.TNresolve_expressionr   z&Forced update did not affect any rows.z0Save with update_fields did not affect any rows._order   )output_field)_order__maxr  r;   ).r\   rs  local_concrete_fieldsr   rJ   r   r"  r  get_pk_value_on_saver   r   r   r   allr   rN  rt   r/   r>  referenced_fieldsintersectionrS   r1  
_do_updatebool_assign_returned_valuesrg   r   get_filter_kwargs_for_objectrO  	aggregater&   r   r   r   r   r  
auto_fieldlistdb_returning_fieldsr   featurescan_return_columns_from_insertdb_returningrL  
_do_insert)r=   r  r   rf  rg  rN  rh  r   rs  r   non_pks_non_generatedrD  pk_setr  base_qsr  forced_updatereturning_fieldsr   _modelrT   resultsfilter_argsinsert_fieldsr  s                            r>   r  zModel._save_table  ss    yyNN	 //!
	!!++ !
 !
  /%66]*aii=.H %! % t$WW11$7FD$''//62&<=TUU   ""R4>>RRL ,''--e4G / 	 14WT199-!**T5:QF  *9\M%%d+F 33 KK++889NO	     )/ 3$vu!)UZZ=-Hg/O %++E2	3
 oo G w-'w',,WQZ9IJoo&NOOooF  )) 22#@@FC%%++E2V+)+Y$,- #Ha 8|~ "!H	%   $	%  33{{!4??2J M 
  $D$<$<=-8.h55 + ' 347GD%--0U^^DRW=X  5"67$44(//6&&:#(@$++E23 oo!!5-9I3G ,,WQZ9IJm!
%4 `s   P5%P:?4P?0Q%Q	c                 &   |j                  |      }|s||j                         rdgS g S | j                  j                  r?|s=|j                         sg S |j	                  ||      x}	r|	S |j                         rdgS g S |j	                  ||      S )z
        Try to update the model. Return True if the model was updated (if an
        update query was done and a matching row was found in the DB).
        rK  r;   )rO  existsr\   select_on_save_update)
r=   r  rN  rD  r  rh  r  r  filteredr  s
             r>   r  zModel._do_update  s     >>V>, (HOO,=tI::$$] ??$	"**63CDDwD#??,B44"4(899rA   c                 0    |j                  | g||||      S )z
        Do an INSERT. If returning_fields is defined then this method should
        return the newly created data for the model.
        )r   r  rN  r  )_insert)r=   r   rN  r   r  r  s         r>   r  zModel._do_insert  s+    
 F-  
 	
rA   c                     t        |      }t        ||      D ]  \  }}t        | |j                  |        |D ](  }| j                  j                  |j                  d        * y r   )r   r   r   r   r   rr   )r=   returned_valuesr  returning_fields_iterrT   r   s         r>   r  zModel._assign_returned_values  sb     $%5 61FG 	0LE5D%--/	0 + 	3EMMemmT2	3rA   c                    | j                   j                  D ]"  }|r||vr|j                  s|j                  |       s*t	        | |j
                  d       }|sD|j                         sL|j                  j                  s|j                  j                  |       t        |d|j
                  d      t	        | |j                        |j                  v rt        | |j
                  |       t	        ||j                  j                        t	        | |j                        k7  s|j                  |        % | j                   j                  D ]v  }|r||vr
|j                  s|j                  |       s)t!        |d      s6|j#                  | d       }|sL|j                         r]t        | d|j
                   d       y )NzB() prohibited to prevent data loss due to unsaved related object 'rk   fk_field)default)r\   r   rR  rS  rt   rJ   r"  r   multiplerV  r   r   empty_valuesr   r@  r   rS   rU  )r=   rk  r   r   r   s        r>   rn  z&Model._prepare_related_fields_for_save  s   
 ZZ//  	4E%v-   U__T%:dEJJ5 ~~' --66**>>sC$2@%**N  T5==1U5G5GG D%**c2 3 2 2 : :;w%--@  --d3A 	4D ZZ.. 	E%v-!!OOD)E:.,,T4,@s~~/$)* +338::,bB 	rA   c                 T   | j                         sCt        | j                  j                  d| j                  j                  j
                  d      |xs! t        j                  | j                  |       }t        ||       }|j                  | g|       |j                         S )Nz% object can't be deleted because its z attribute is set to None.rl  )rN  r  )keep_parents)r"  r   r\   r)  r  r   r   ro  r   r   collectdelete)r=   rN  r  	collectors       r>   r  zModel.delete	  s     "jj44djjmm6K6KM  K,,T^^dKE$7	4&|<!!rA   c                 X   K    t        | j                        ||       d {   S 7 w)N)rN  r  )r   r  )r=   rN  r  s      r>   adeletezModel.adelete  s.     /]4;;/%
 
 	
 
s   !*(*c                     t        | |j                        }t        t        |j                              }t        |j                  t        |      |      d      S )NT)strings_only)rt   r   dictr3   flatchoicesr2   r   )r=   r   rT   choices_dicts       r>   _get_FIELD_displayzModel._get_FIELD_display  sK    emm,M%*;*;<=]5159
 	
rA   c                    | j                         st        d      |rdnd}|rdnd}t        | |j                        }t	        j
                  |j                  |fd| | j                  fgt        j                        }t	        j
                  ||j                   d| |fgt        j                        } | j                  j                  j                  | j                  j                        j                  di |j                  |      j!                  ||j                  d	|z        }	 |d
   S # t"        $ r3 | j%                  d| j                  j&                  j(                  z        w xY w)Nz8get_next/get_previous cannot be used on unsaved objects.gtlt -pk__)	connector__z%spkr   z!%s matching query does not exist.r;   )r"  r   rt   r   r*   createrJ   r  ANDORr   r   rN  r   r   rO  order_byr   r^   r\   r)  )	r=   r   r   r   oporderparamqqss	            r>   _get_next_or_previous_by_FIELDz$Model._get_next_or_previous_by_FIELD&  s=    WXXT$3emm,HHuzz5)d2$K+ABaeeTHHaUZZL2$/78ADDIDNN++11$++..AVVAYXuzz2FUNC	 		a5L 	##3dnn6J6J6V6VV 	s   2D7 7<E3c                 ,   d|z  }t        | |      s|rdnd}|rdnd}| j                  j                  }|j                  |       }  | j                  j
                  j                  di |j                  di d|z   | j                  j
                  j                  d      j                  di | j                  j                  j                  | j                  iij                  |      d d j                         }t        | ||       t        | |      S )	Nz__%s_order_cacher  r  r  z-_orderz
_order__%sr  r;   )rS   r\   r   r  r   r   rO  r  r  rJ   r  r   r   rt   )r=   r   	cachenamer  r  order_fieldr  r   s           r>   r   z$Model._get_next_or_previous_in_order;  s   &0	tY' dB 'HYE**::K%BB4HK6//66EE %Udnn==DDXNUU #zz}}11477; %!	%   D)S)tY''rA   c                     
t               |xs  j                  }i }g }|j                  D ]  }|j                  v r|j                  r@t        fd j                  |j                        D              rM|j                  |       _t        |j                  t              r@||j                  vr2t         fd|j                  D              }t        |      dk(  r*|d   }n$|j                   rt#         |j$                        }n|rt'        |d      st)        ||      }|||j                  <   |||j$                  <    dvr#t)         j*                  |j*                        |d<   |ro|j-                         D ci c]  \  }}t/        |      | }}}|D ]>  }	t1        |	j                  j3                  |      |	j4                        ||	j                  <   @ |S c c}}w )Nc              3   ,   K   | ]  }|d    v   yw)r   Nr;   )rb   refexcludes     r>   rd   z2Model._get_field_expression_map.<locals>.<genexpr>\  s"       Fg%s   c              3   6   K   | ]  }t        |        y wr   )rt   )rb   
from_fieldr=   s     r>   rd   z2Model._get_field_expression_map.<locals>.<genexpr>g  s      2<GD*-s   r  r   r  r  )r   r\   r}   rJ   r   r   _get_expr_references
expressionr1  rq   r   r"   r  ry   from_fieldsr   rQ  rt   r   rS   r   r  rs   r)   r   replace_expressionsr  )
r=   r   r  	field_mapgenerated_fieldsr   rT   rJ   replacementsgenerated_fields
   ` `       r>   _get_field_expression_mapzModel._get_field_expression_mapR  s   ?eG!tzz	&& 	-EzzW$ #889I9IJ   ''.5--/?@!;!;; @E@Q@Q  u:?!!HEemm4/C DeU+$)Iejj!',Iemm$7	-8 w#DGGTWW5IdO>Goo>OP{tUAdGUNPLP#3 2C#..BB<P#003	/../  Qs   G!c                     | j                         st        d| z        t        | |j                  j	                         j
                        S )Nz9Unsaved model instance %r cannot be used in an ORM query.)r"  r   rt   r   get_related_fieldr   )r=   r   s     r>   prepare_database_savezModel.prepare_database_save  sE     KdR  tU//AACKKLLrA   c                      y)aQ  
        Hook for doing any extra model-wide validation after clean() has been
        called on every field by self.clean_fields. Any ValidationError raised
        by this method will not be associated with a particular field; it will
        have a special-case association with the field defined by
        NON_FIELD_ERRORS.
        Nr;   r<   s    r>   cleanzModel.clean  s     	rA   c                     | j                  |      \  }}| j                  |      }| j                  |      }|j                         D ]&  \  }}|j	                  |g       j                  |       ( |rt        |      y)zh
        Check unique constraints on the model and raise ValidationError if any
        failed.
        r  N)_get_unique_checks_perform_unique_checks_perform_date_checksrs   
setdefaultextendr   )r=   r  unique_checksdate_checkserrorsdate_errorskvs           r>   validate_uniquezModel.validate_unique  s    
 &*%<%<W%<%M"{,,];//<%%' 	/DAqa$++A.	/ !&)) rA   c                 j   
t               g }| j                  | j                  j                  fg}g }|r#| j                  | j                  j                  fg}| j                  j
                  D ]  }|j                  j                  r'|j                  ||j                  j                  f       |sC|j                  j                  sZ|j                  ||j                  j                  f        |D ]=  \  }}|D ]3  }	t        fd|	D              r|j                  |t        |	      f       5 ? |rM|D ]H  \  }}
|
D ]>  }t        fd|j                  D              r"|j                  ||j                  f       @ J g }| j                  | j                  j                  fg}| j                  j
                  D ])  }|j                  ||j                  j                  f       + |D ]@  \  }}|D ]4  }|j                  }|v rt        |t              rAt        d |j                  D              }j                  |      r|j                  ||f       f|j                  r|j                  ||ff       |j                   r-|j                   vr|j                  |d||j                   f       |j"                  r-|j"                  vr|j                  |d||j"                  f       |j$                  s|j$                  vs|j                  |d||j$                  f       7 C ||fS )a{  
        Return a list of checks to perform. Since validate_unique() could be
        called from a ModelForm, some fields may have been excluded; we can't
        perform a unique check on a model that is missing fields involved
        in that check. Fields that did not validate should also be excluded,
        but they need to be passed in via the exclude argument.
        c              3   &   K   | ]  }|v  
 y wr   r;   rb   rJ   r  s     r>   rd   z+Model._get_unique_checks.<locals>.<genexpr>  s     =t47?=   c              3   &   K   | ]  }|v  
 y wr   r;   r  s     r>   rd   z+Model._get_unique_checks.<locals>.<genexpr>  s     M4twMr  c              3   4   K   | ]  }|j                     y wr   r   rb   r   s     r>   rd   z+Model._get_unique_checks.<locals>.<genexpr>  s     !C%**!Cr   dateyearmonth)r   r   r\   unique_togethertotal_unique_constraintsall_parentsr1  r   ry   r   r}   rJ   rq   r!   
isdisjointuniqueunique_for_dateunique_for_yearunique_for_month)r=   r  include_meta_constraintsr  unique_togethersconstraintsparent_classmodel_classr  checkmodel_constraints
constraintr  fields_with_classr   r   rJ   namess    `                r>   r  zModel._get_unique_checks  s    ?eG!^^TZZ-G-GHI# NNDJJ,O,OPQK JJ22 	L!!11 ''!<#5#5#E#EF (L,>,>,W,W""!<#5#5#N#NO	 -= 	F(K( F=u==!((+uU|)DEF	F $2= O.."3 OJM:;L;LMM%,,k:;L;L-MNOO 
 #nndjj.E.EFG JJ22 	VL$$lL4F4F4S4S%TU	V $5 	YK Yvv7?a!45!!C!((!CCE))%0%,,k5-AB88!((+w)?@$$):):')I&&VT1CTCT'UV$$):):')I&&VT1CTCT'UV%%!*<*<G*K&&WdADVDV'WX!Y	Y$ k))rA   c                 2   i }|D ]  \  }}i }|D ]  }| j                   j                  |      }t        | |j                        }||dk(  rt        j
                  j                  rV||j                   j                  v r| j                  j                  s||t        |      <    t        |      t        |      k7  r |j                  j                  di |}	| j                  |j                         }
| j                  j                  s-| j                  |j                         r|	j!                  |
      }	|	j#                         sDt        |      dk(  r|d   }nt$        }|j'                  |g       j)                  | j+                  ||              |S )Nr  rK  r  r   r;   )r\   r  rt   r   r   r  !interprets_empty_strings_as_nullsrs  r   r   strr   r   rO  r>  r"  r  r  r
   r  r1  unique_error_message)r=   r  r  r  unique_checklookup_kwargsrc  r   lookup_valuer  model_class_pkkeys               r>   r  zModel._perform_unique_checks  sx   )6 *	%K M* >
JJ((4&tQYY7' B&"++MM ))333DKK<N<N1=c*o.>  < C$664--44E}EB "--k.?.?@N;;%%$//+:K:K*LZZ>Z2yy{|$)&q/C*C!!#r*11--k<HQ*	X rA   c                 H   i }|D ]  \  }}}}i }t        | |      }||dk(  r7|j                  |d|z  <   |j                  |d|z  <   |j                  |d|z  <   nt        ||      ||d|<   t        | |      ||<    |j                  j
                  di |}	| j                  j                  s,| j                         r|	j                  | j                        }	|	j                         s|j                  |g       j                  | j                  |||              |S )Nr  z%s__dayz	%s__monthz%s__yearr  rK  r;   )rt   dayr  r  r   rO  r   r   r"  r  r  r  r  r1  date_error_message)
r=   r  r  r  lookup_typer   
unique_forr%  r  r  s
             r>   r  zModel._perform_date_checks  s,   ;F 	7KeZM 4,D|f$8<i*45:>**kJ679=j:56FM+G*kBC $+4#7M% 4--44E}EB ;;%%$//*;ZZ477Z+yy{!!%,33++K
K1	6 rA   c                    | j                   }|j                  |      }t        |j                  d   d| t	        |j
                        ||t	        |j
                        |t	        |j                  |      j
                        d      S )Nr  )r   r   r,  r   field_label
date_fielddate_field_labelmessagecodeparams)r\   r  r   error_messagesr4   verbose_name)r=   r,  rc  r-  r   r   s         r>   r+  zModel.date_error_message5  s|    zzz*(():;"&t'8'89*#'(:(:;($,T^^J-G-T-T$U
 	
rA   c                    |j                   }| |t        |j                        |d}t        |      dk(  rG|j	                  |d         }t        |j                        |d<   t        |j                  d   d|      S |D cg c]&  }t        |j	                  |      j                        ( }}t        |t        d            |d<   t        t        d	      d
|      S c c}w )N)r   r  r   r$  r  r   r/  r  r2  andfield_labelsz9%(model_name)s with this %(field_labels)s already exists.r  )	r\   r4   r7  r   r  r   r6  r5   _)r=   r  r$  r   r5  r   r   r:  s           r>   r#  zModel.unique_error_messageF  s       &"4#4#45(	
 |!NN<?3E$,U-?-?$@F=!",,X6  CO=>*778L  &3<5%JF>""UV& 	s    +Cc                     | j                   | j                  j                  fg}| j                  j                  D ]@  }|j                  j                  s|j	                  ||j                  j                  f       B |S r   )r   r\   r  r  r1  )r=   r  r  s      r>   get_constraintszModel.get_constraintsf  sn    

(>(>?@ JJ22 	SL!!--""L,2D2D2P2P#QR	S rA   c                    | j                         }t        j                  | j                  |       }i }|D ]"  \  }}|D ]  }	 |j	                  || ||        $ |rt        |      y # t
        $ rr}t        |dd       dk(  rGt        |j                        dk(  r/|j                  |j                  d   g       j                  |       n|j                  |      }Y d }~d }~ww xY w)Nrl  )r  rN  r4  r  r  r   )r=  r   ro  r   validater   rt   r   r   r  r1  update_error_dict)	r=   r  r  rN  r  r  r  r  es	            r>   validate_constraintszModel.validate_constraintsm  s    **,##DNNTB.9 	=*K*/ 
=
	=''T7RW'X
=	= !&))  ' =640H<
 1 12a7))**;*;A*>CJJ1M!"!4!4V!<=s   A))	C$2A(CC$c                    i }|t               }nt        |      }	 | j                  |       	 | j	                          |r:|D ]"  }|t
        k7  s||vs|j                  |       $ 	 | j                  |       |r:|D ]"  }|t
        k7  s||vs|j                  |       $ 	 | j                  |       |rt        |      y# t        $ r}|j                  |      }Y d}~d}~ww xY w# t        $ r}|j                  |      }Y d}~d}~ww xY w# t        $ r}|j                  |      }Y d}~d}~ww xY w# t        $ r}|j                  |      }Y d}~d}~ww xY w)z
        Call clean_fields(), clean(), validate_unique(), and
        validate_constraints() on the model. Raise a ValidationError for any
        errors that occur.
        Nr  )	r   clean_fieldsr   r@  r  r
   r   r  rB  )r=   r  r  rB  r  rA  rJ   s          r>   
full_cleanzModel.full_clean  sh    ?eG'lG	1g.	1JJL
  &++G0CKK%&5$$W$5
   &++G0CKK%&5))'): !&)) =  	1((0F	1  	1((0F	1 # 5,,V45 # 5,,V45s^   C C, )D %D: 	C)C$$C),	D5DD	D7D22D7:	EEEc           	         |
t               }i }| j                  j                  D ]  }|j                  |v s|j                  rt        | |j                        }|j                  r||j                  v rOt        |t              r`	 t        | |j                  |j                  ||               |rt        |      y# t        $ r#}|j                  ||j                  <   Y d}~d}~ww xY w)z
        Clean all fields and raise a ValidationError containing a dict
        of all validation errors if any occur.
        N)r   r\   r   rJ   r   rt   r   blankr  rq   r    r   r  r   
error_list)r=   r  r  r   	raw_valuerA  s         r>   rD  zModel.clean_fields  s    
 ?eG"" 	.Avv AKK  aii0Iww96)_5.aiiD)AB	.  !&))  # .!"qvv.s   'B==	C)C$$C)c                    g | j                         | j                          | j                  di |}| j                  j                  s:|j                  d      xs g }|g  | j                  di || j                         | j                  |      z  }g | j                         | j                         | j                         | j                         | j                         }|j                  |       |s|j                  | j                                |g | j!                         | j#                  |      | j%                         | j'                  |      | j)                  |      | j+                         z  }|S )N	databasesr;   )_check_swappable_check_model_check_managersr\   r{   r   _check_fields$_check_m2m_through_same_relationship_check_long_column_names_check_id_field_check_field_name_clashes#_check_model_name_db_lookup_clashes3_check_property_name_related_field_accessor_clashes_check_single_primary_keyr  _check_column_name_clashes_check_unique_together_check_indexes_check_ordering_check_constraints_check_db_table_comment_check_composite_pk)r   r   r  rK  clash_errorss        r>   r  zModel.check  s   
!!#

 !S  *6*

 yy  

;/52I """,V,99; --i8 F
$$&..0 88: HHJ	
 ..0L MM,'  c<<>? ++-##I. $$& ''	2	
 ,,Y7 ((* F rA   c           
      &   g }| j                   }|j                  }|j                  st        |t              s|S t        t              }|j                  D ]  }d }	 |j                  |      }|s|d}nh|j                  s|d}nV|j                  r|d}nD|j                  r|d}n2||j                  vr|d}n||j                     j                  |       |s|j                  t        j                   |d|| d              |j#                         D ]a  \  }}	t%        |	      d	kD  s|	^}}
d
j'                  d |
D              }|j                  t        j                   | d| d|d| d             c |S # t        $ r d }Y $w xY w)Nz is not a valid field.z field has no column.z field may not set 'null=True'.z field is a generated field.z field is not a local field.z1 cannot be included in the composite primary key.zmodels.E042hintr   idr  r   c              3   2   K   | ]  }t        |        y wr   r   r
  s     r>   rd   z,Model._check_composite_pk.<locals>.<genexpr>  s     &EutE{&Er   z and z are the same fields.)r\   r  rz   rq   r!   r   r  r   r  r   r   nullr   r}   r1  r	   Errorrs   r   r   )r   r  r   r  seen_columnsrc  ra  r   r   r   rest
duplicatess               r>   r]  zModel._check_composite_pk  s   yyWW::Z,?@M"4(.. 	JDz2 $'=>\\$'<=$'FG$'CDd///$'CDU\\*11*=LL%. ) !(-	@ $0#5#5#7 	FK;!#$/!
T!YY&E&EE
LL%, '  *|5>ST(		 S % s   FFFc                 P   | j                   j                  sg S g }|D ]  }t        j                  ||       st        |   }|j
                  j                  r:d| j                   j                  v rS|j                  t        j                  |j                   d| d              |S )Nsupports_commentsz8 does not support comments on tables (db_table_comment).zmodels.W046r   rb  )r\   db_table_commentr   allow_migrate_modelr   r  rj  required_db_featuresr1  r	   Warningdisplay_name)r   rK  r  r   r   s        r>   r\  zModel._check_db_table_comment,  s    yy))I 	B--b#6$RJ##55&#))*H*HHNN%223 45 6(		  rA   c                    g }| j                   j                  r,	 t        j                  | j                   j                         |S |S # t        $ rA |j                  t        j                  d| j                   j                  z  d             Y |S t        $ rp | j                   j                  j                  d      \  }}|j                  t        j                  d| j                   j                  d|d|dd             Y |S w xY w)	z"Check if the swapped model exists.z-'%s' is not of the form 'app_label.app_name'.zmodels.E001rb  rH   'z' references 'z0', which has not been installed, or is abstract.zmodels.E002)r\   r{   r   	get_modelr   r1  r	   re  	swappableLookupErrorsplit)r   r  r]   r   s       r>   rL  zModel._check_swappableC  s     99syy001& v%  LLG))--.("   	(+		(9(9(?(?(D%	:LL 99..	:G )	 	s   )A ADA4DDc                     g }| j                   j                  r_| j                   j                  s| j                   j                  r3|j	                  t        j                  d| j                  z  d             |S )Nz'Proxy model '%s' contains model fields.zmodels.E017rr  )r\   rz   r}   r~   r1  r	   re  rD   r   r  s     r>   rM  zModel._check_model^  sY    99??yy%%)E)ELLACLLP( rA   c                     g }| j                   j                  D ]#  }|j                   |j                  di |       % |S )zPerform all manager checks.r;   )r\   r   r  r  )r   r   r  r   s       r>   rN  zModel._check_managersk  sA     yy)) 	3GMM-'--1&12	3rA   c                     g }| j                   j                  D ]#  }|j                   |j                  di |       % | j                   j                  D ]%  }|j                   |j                  dd| i|       ' |S )zPerform all field checks.
from_modelr;   )r\   r}   r  r  r~   )r   r   r  r   s       r>   rO  zModel._check_fieldss  s{     YY++ 	1EMM+%++//0	1YY11 	AEMM+%++???@	ArA   c                    g }g }| j                   j                  }d |D        }d |D        }|D ]  }|j                  j                  | |j                  j                  |j                  j
                  f}||v rS|j                  t        j                  d|j                  j                  j                   j                  z  | d             |j                  |        |S )zT
        Check if no relationship model is used by more than one m2m field.
        c              3   j   K   | ]+  }t        |j                  j                  t              s(| - y wr   )rq   r   r   rW   r   s     r>   rd   z=Model._check_m2m_through_same_relationship.<locals>.<genexpr>  s#     Sz!..2F2F	'R!S   )33c              3   j   K   | ]+  }t        |j                  j                  t              s(| - y wr   )rq   r   rm  rW   r   s     r>   rd   z=Model._check_m2m_through_same_relationship.<locals>.<genexpr>  s#     Uz!..2H2H)'T!Ur  zWThe model has two identical many-to-many relations through the intermediate model '%s'.zmodels.E003rk  )
r\   r~   r   r   rm  through_fieldsr1  r	   re  rw   )r   r  seen_intermediary_signaturesr   r   	signatures         r>   rP  z*Model._check_m2m_through_same_relationship}  s     ')$-- TVS VVU 	?A$$&&--	I 88LL?..0066<<=  ( -33I>%	?& rA   c                 D   | j                   j                  D cg c].  }|j                  dk(  s|| j                   j                  k7  s-|0 }}|rK|d   j                  s<| j                   j                  j                  dk(  rt        j                  d| d      gS g S c c}w )z%Check if `id` field is a primary key.rb  r   zP'id' can only be used as a field name if the field also sets 'primary_key=True'.zmodels.E004rk  )r\   r}   rJ   r  primary_keyr	   re  )r   r   r   s      r>   rR  zModel._check_id_field  s     yy--
4ADUA
 
 &)//CIILL4E4E4M/$	  I
s   BBBc                 
   g }i }| j                   j                  D ]  }|j                   j                  D ]  }|j                  |j                        xs |j                  |j
                        xs d}|rp|j                  t        j                  d|j                  d|j                  j                   d|j                  d|j                  j                   d	| d             |||j                  <   |||j
                  <     | j                   j                  D ]5  }|j                   j                         D ]  }||vs|||j                  <    7 | j                   j                  j                         D ]  }|s|j                  |j                        xs d}|s(|j                  t        j                  d|j                   d|j                   d|j                  j                    d| d	              | j                   j                  D ]  }|j                  |j                        xs |j                  |j
                        xs d}|j                  d
k(  xr$ |xr  |j                  d
k(  xr |j                  | k(  }|r[|sY|j                  t        j                  d|j                  d|j                  d|j                  j                   d|d	             |||j                  <   |||j
                  <    |S )z2Forbid field shadowing in multi-table inheritance.NzThe field 'z' from parent model 'z' clashes with the field 'rk   zmodels.E005rk  z' from model 'zmodels.E006rb  )r\   r  r}   r   rJ   r   r1  r	   re  r   
get_fieldsr   r  )r   r  used_fieldsr   r   clashrn   id_conflicts           r>   rS  zModel._check_field_name_clashes  s     ii++ 	+F\\.. +#/U;??1993MUQUMM  %zz5;;+<+<affaggmmU !$,	 '(AFF#)*AII&+	+( ii++ 	,F\\,,. ,K'*+K',	, 99,,335 	KOOK$4$45=ELL%k&6&6%7 8!JJ<~ekk6G6G5HL(		 '' 	'AOOAFF+Q{qyy/IQTE $V5VUZZ4-?VEKKSVDV  [LL./ffejj%++BSBSU(	 #$K%&K		"'	'* rA   c           
          g }g }| j                   j                  D ]_  }|j                  }|r>||v r:|j                  t	        j
                  d|j                  d|dd| d             O|j                  |       a |S )NzField 'z' has column name 'z ' that is used by another field.z$Specify a 'db_column' for the field.zmodels.E007r`  )r\   r}   r   r1  r	   re  rJ   )r   used_column_namesr  r   column_names        r>   rW  z Model._check_column_name_clashes  s     '' 	6A((K {.??LL,-FFKAC( "((5	6" rA   c                 "   g }| j                   }|j                  d      s|j                  d      r,|j                  t	        j
                  d|z  | d             |S t        |v r*|j                  t	        j
                  d|z  | d             |S )Nr;  zgThe model name '%s' cannot start or end with an underscore as it collides with the query lookup syntax.zmodels.E023rk  zbThe model name '%s' cannot contain double underscores as it collides with the query lookup syntax.zmodels.E024)rD   
startswithendswithr1  r	   re  r   )r   r  r   s      r>   rT  z)Model._check_model_name_db_lookup_clashes  s    \\
  %)<)<S)AMMCEOP$	"  :%MM@BLM$	 rA   c                     g }| j                   j                  }d | j                   j                  d      D        }|D ]1  }||v s|j                  t	        j
                  d|z  | d             3 |S )Nc              3   d   K   | ](  }|j                   r|j                  |j                   * y wr   )rR  related_modelr   r   s     r>   rd   zLModel._check_property_name_related_field_accessor_clashes.<locals>.<genexpr>2  s,      #
}}!< II#
s   .0Freversez8The property '%s' clashes with a related field accessor.zmodels.E025rk  )r\   r  _get_fieldsr1  r	   re  )r   r  r  related_field_accessorsaccessors        r>   rU  z9Model._check_property_name_related_field_accessor_clashes.  s    22#
YY**5*9#

 0 		H>)LL$&./(			 rA   c                     g }t        d | j                  j                  D              dkD  r'|j                  t	        j
                  d| d             |S )Nc              3   :   K   | ]  }|j                   sd   yw)r  N)r  r   s     r>   rd   z2Model._check_single_primary_key.<locals>.<genexpr>F  s     BQAMMqBs   r  zBThe model cannot have more than one field with 'primary_key=True'.zmodels.E026rk  )sumr\   r}   r1  r	   re  ry  s     r>   rV  zModel._check_single_primary_keyC  sN    B#))00BBQFMM*$	 rA   c                    t        | j                  j                  t        t        f      st        j                  d| d      gS t        d | j                  j                  D              rt        j                  d| d      gS g }| j                  j                  D ]#  }|j                  | j                  |d             % |S )z,Check the value of "unique_together" option.z*'unique_together' must be a list or tuple.zmodels.E010rk  c              3   J   K   | ]  }t        |t        t        f         y wr   )rq   ry   r  )rb   r   s     r>   rd   z/Model._check_unique_together.<locals>.<genexpr>]  s&      
 6E4=11
s   !#z7All 'unique_together' elements must be lists or tuples.zmodels.E011r  )
rq   r\   r  ry   r  r	   re  r   r  _check_local_fields)r   r  r   s      r>   rX  zModel._check_unique_togetherQ  s     #))33eT]C@$   
))33
 

 M$  F))33 Rc55f>OPQRMrA   c                     g }|D ]^  }t        j                  ||       st        |   }| j                  j                  D ]#  }|j                  |j                  | |             % ` |S r   )r   rm  r   r\   r   r  r  )r   rK  r  r   r   r   s         r>   rY  zModel._check_indexeso  si     	<B--b#6$RJ** <ekk#z:;<		< rA   c                 0   ddl m} i }| j                  j                  d      D ]-  }|||j                  <   t        |d      s|||j                  <   / g }|D ]{  }	 ||   }t        |j                  |j                        r2|j                  t        j                  d|d|d|d	| d
             \t        ||j                        r1|j                  t        j                  |d|d|d| d             t        |j                  t              r_|| j                  j                  vrGt!        |j"                        dkD  r/|j                  t        j                  |d|d| d             || j                  j$                  vs6|j                  t        j                  d|d|d| j                  j&                  d	d| d             ~ |S # t(        $ r2 |j                  t        j                  d|d|d	| d             Y w xY w)Nr   )modelsFr  r   rs  z' refers to a ManyToManyField 'z.', but ManyToManyFields are not permitted in 'rk   zmodels.E013rk  z! refers to a CompositePrimaryKey z0, but CompositePrimaryKeys are not permitted in rH   zmodels.E048r  z refers to a ForeignObject zE with multiple 'from_fields', which is not supported for that option.zmodels.E049z' refers to field 'z' which is not local to model 'z4This issue may be caused by multi-table inheritance.zmodels.E016r`  z#' refers to the nonexistent field 'zmodels.E012)	django.dbr  r\   r  rJ   rS   r   rq   r   ManyToManyRelr1  r	   re  r!   r"   r  r   r  r}   r)  r  )r   r   optionr  forward_fields_mapr   r  rc  s           r>   r  zModel._check_local_fieldsz  s   $  YY**5*9 	:E-2uzz*ui(49"5==1	:
   ?	J>*:6 e00&2F2FGMM !' * & !$,
  v'A'ABMM%j(I)n -,,2:Q8 !$, u113CDSYY%D%DDE--.2MM%j(CJ> R& & !$, #))"8"88MM'-z399;P;PR!W #,o?	@ {  LL #&
  (
s   G7HHc           
      P   | j                   j                  rt        j                  d| d      gS | j                   j                  s| j                   j
                  sg S t        | j                   j
                  t        t        f      st        j                  d| d      gS g }| j                   j
                  }d |D        }d |D        }g }g }|D ]-  }t        |v r|j                  |       |j                  |       / |}|D ]  }| }d}|j                  t              D ]l  }		 |	d	k(  r|j                   j                  }n|j                   j                  |	      }|j                  r$|j                  d
   j                   j"                  }nd}n  |D ch c]
  }|d	k7  s	| }}g }
| j                   }t-        t/        j0                  d t/        |j2                  |j4                        D                    }|
j7                  ||z
         |
D ],  }|j                  t        j                  d|z  | d             . |S # t$        t&        f$ rR |"|j)                  |	      ;|j+                  |	      *|j                  t        j                  d|z  | d             Y ~w xY wc c}w )ze
        Check "ordering" option -- is it a list of strings and do all fields
        exist?
        z?'ordering' and 'order_with_respect_to' cannot be used together.zmodels.E021rk  zQ'ordering' must be a tuple or list (even if you want to order by only one field).zmodels.E014c              3   N   K   | ]  }t        |t              s|d k7  s|  yw)?N)rq   r"  r   s     r>   rd   z(Model._check_ordering.<locals>.<genexpr>  s     Gz!S'9a3h!Gs   %%%c              3   >   K   | ]  }|j                  d         yw)r  N)removeprefixr   s     r>   rd   z(Model._check_ordering.<locals>.<genexpr>  s     6!!..%6s   Nr  zJ'ordering' refers to the nonexistent field, related field, or lookup '%s'.zmodels.E015c              3      K   | ]O  }|j                   r|j                  r|j                  |j                  fn|j                  j                         f Q y wr   )rm   rQ  rJ   r   r   related_query_namer   s     r>   rd   z(Model._check_ordering.<locals>.<genexpr>	  sN         NN1:: VVQYY'''44689 s   AA)r\   _ordering_clashr	   re  r   ri   rq   r  ry   r   r1  rw  r  r  rR  
path_infosto_optsr   r   AttributeErrorget_transform
get_lookupr   r   from_iterabler   rW  r  )r   r  r   _fieldsrelated_fieldsr   r   _clsfldpartinvalid_fieldsr   valid_fieldsinvalid_fields                 r>   rZ  zModel._check_ordering  s    99$$U$  99**#))2D2DI#)),,tUm<'$	  ## HVG 7v6  	"AQ%%a(q!		"
  $ 	EDCJ/ t|"jjmm"jj2248"~~b199??#	: $1qDy!11  yy   t{{D,@,@A  	
 	f|34+ 	MMM-/<=$		 [ *>: {))$/7CNN4<P<X"LL!ACH!I$'#0		 2s    %A)H?
J#!J#?AJ J c                    |sg S g }d}d}|D ]f  }t        j                  ||       st        |   }|j                  j	                         }||j
                  j                  rV||}|}]||k  sc|}|}h ||S | j                  j                  D ]_  }|j                  |j                  x}	t        |	      |kD  s.|j                  t        j                  d|	d|d|dd| d             a | j                  j                  D ]  }t!        |j"                  j$                  t&              r(|j"                  j$                  j                  j                  D ]_  }
|
j                  |
j                  x}t        |      |kD  s.|j                  t        j                  d	|d|d|dd
| d             a  |S )z
        Check that any auto-generated column names are shorter than the limits
        for each database in which the model will be created.
        Nz.Autogenerated column name too long for field "z". Maximum length is "z" for database "z".z/Set the column name manually using 'db_column'.zmodels.E018r`  z2Autogenerated column name too long for M2M field "z\Use 'through' to create a separate model for M2M and then set column_name using 'db_column'.zmodels.E019)r   rm  r   opsmax_name_lengthr  truncates_namesr\   r}   	db_columnr   r   r1  r	   re  r~   rq   r   rm  r"  )r   rK  r  allowed_lendb_aliasr   r   r  r   r  m2mrel_names               r>   rQ  zModel._check_long_column_names6	  s    I  	"B--b#6$RJ(nn<<>O&**=*=*M*M&"1K!H${2"1K!H	"  M'' 	A #$%HH,[9${2LL 'X? O(		& -- 	A!..00#6 ~~--33@@ MM)%(ZZ/<H3MM  (h@!R !$,
	6 rA   c              #     K   t        |t              rz|j                  D ]j  }t        |t              r?|\  }}t        |j	                  t
                     | j                  |      E d {    R| j                  |      E d {    l y t        |t              r+t        |j                  j	                  t
                     y t        |d      r/|j                         D ]  }| j                  |      E d {     y y 7 7 7 w)Nget_source_expressions)rq   r*   childrenry   rw  r   r  r)   rJ   rS   r  )r   exprchildlookuprT   src_exprs         r>   r  zModel._get_expr_references	  s     dA ?eU+$)MFEZ 899"77>>>"77>>>? a 		
344T34 779 >33H===> 5 ?>
 >s7   A)D
+D,D
DA5D
;D<	D
D
D
c                     g }|D ]^  }t        j                  ||       st        |   }| j                  j                  D ]#  }|j                  |j                  | |             % ` |S r   )r   rm  r   r\   r  r  r  )r   rK  r  r   r   r  s         r>   r[  zModel._check_constraints	  so     	AB--b#6$RJ!ii33 A
j..sJ?@A		A rA   r   )NNN)FFFNN)FNFFNNr  )NTT)IrD   rE   rF   r  classmethodr  r?   rC   r   r$  r-  r&  r<  r>  rA  r   r  r"  rF  r_  ra  rd  rj  alters_datary  r}  rt  r  r  r  r  r  rn  r  r  r  r  r   r  r  r  r  r  r  r  r+  r#  r=  rB  rE  rD  r  r]  r\  rL  rM  rN  rO  rP  rR  rS  rW  rT  rU  rV  rX  rY  r  rZ  rQ  r  r[  rY   r   s   @r>   r   r     sK   q2f 
 
<E!
1"$,.; 
+{	+B

R/h

,( D
L D
 
 E * DL !I HL-b EN%:N
34l	" F
 G
*(.,\M* B*H/b>
"@*(-*^*8 " "H 8 8t  ,  4 
 
     # #J  $ C CJ  2  .  (    :   L L\ j jX M M^ > >  rA   r   )	metaclassc           
         |j                   j                  }|j                  |       } |j                  j	                  |      j
                  di |j                  t        |      D cg c]  \  }} |||       c}}dg       y c c}}w )N)r  r  r  r;   )r\   r   get_forward_related_filterr   rM  rO  bulk_update	enumerate)r=   ordered_objid_listrN  	order_wrtr  r  r  s           r>   method_set_orderr  	  sx    !!77I66t<K0K""5)00?;?KK;DW;MNieR5	)N	
Ns   *B	
c                     |j                   j                  }|j                  |       }|j                   j                  j                  } |j
                  j                  di |j                  |d      S )NT)flatr;   )r\   r   r  r  rJ   r   rO  values_list)r=   r  r  r  pk_names        r>   method_get_orderr  	  sf    !!77I66t<K""''G%;%%44@@t@TTrA   c                     t        |d| j                  j                         z  t        t        |              t        |d| j                  j                         z  t        t
        |              y )Nzget_%s_orderzset_%s_order)r   rD   lowerr   r  r  )r   r  s     r>   r   r   	  sZ    --//&.
 --//&.rA   c                 n    t        | t              rt        j                  |  }n| }|j	                  |      S )z7Used to unpickle Model subclasses with deferred fields.)rq   ry   r   rt  rp   )model_idr   s     r>   r*  r*  	  s0    (E") ==rA   Tr   )_r   rQ   r8  collectionsr   	functoolsr   	itertoolsr   asgiref.syncr   r'  django.appsr   django.confr   django.corer	   django.core.exceptionsr
   r   r   r   r   r   r   r  r   r   r   r   r   r   django.db.modelsr   r   r   r   r   django.db.models.constantsr   django.db.models.deletionr   r   django.db.models.expressionsr    !django.db.models.fields.compositer!   django.db.models.fields.relatedr"   r#   r$   r%   django.db.models.functionsr&   django.db.models.managerr'   django.db.models.optionsr(   django.db.models.queryr)   r*   django.db.models.signalsr+   r,   r-   r.   r/   django.db.models.utilsr0   r1   django.utils.encodingr2   django.utils.hashabler3   django.utils.textr4   r5   django.utils.translationr6   r;  r8   r   rN   rU   rI   rW   r   r   r   r  r  r   r*  __safe_for_unpickle__r;   rA   r>   <module>r     s       # #  &         W V 1 8 8 A  0 , , '  @ + / 5 6" " :$P
l) l)^ 	5 	5~J) ~P>U
$  (, $rA   