o 3a_@sddlZddlZddlZddlmZddlmZddlZddlm Z ddl m Z ddl m Z ddlmZmZmZmZmZmZddlmZmZmZmZmZmZmZdd lmZmZm Z m!Z!m"Z"dd l#m$Z$dd l%m&Z&m'Z'dd l(m)Z)m*Z*dd l+m,Z,m-Z-m.Z.m/Z/ddl0m1Z1ddl2m3Z3ddl4m5Z5ddl6m7Z7m8Z8ddl9m:Z:m;Z;mZ>ddl?m@Z@ddlAmBZBddlCmDZDddlEmFZFmGZGddlHmIZJGdddZKeKZLddZMddZNGdddeOZPGd d!d!ZQGd"d#d#ZRGd$d%d%ePd&ZSd0d'd(ZTd)d*ZUd+d,ZVd-d.ZWd/eW_XdS)1N) partialmethod)chain)apps)settings)checks)NON_FIELD_ERRORSFieldDoesNotExist FieldErrorMultipleObjectsReturnedObjectDoesNotExistValidationError)DEFAULT_DB_ALIASDJANGO_VERSION_PICKLE_KEY DatabaseError connection connectionsrouter transaction) NOT_PROVIDEDExpressionWrapper IntegerFieldMaxValue LOOKUP_SEP)CheckConstraintUniqueConstraint)CASCADE Collector)ForeignObjectRel OneToOneFieldlazy_related_operationresolve_relation)Coalesce)Manager)Options)FQ)class_prepared post_init post_savepre_initpre_save)make_model_tuple) force_str) make_hashable)capfirst get_text_list) gettext_lazyc@seZdZddZddZdS)DeferredcCdSNzselfr6r67/usr/lib/python3/dist-packages/django/db/models/base.py__repr__+zDeferred.__repr__cCr4r5r6r7r6r6r9__str__.r;zDeferred.__str__N)__name__ __module__ __qualname__r:r<r6r6r6r9r3*s r3cCst|||d|j|fdS)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. z%s.%s)r>r?)typer?)namebasesmodule attached_tor6r6r9subclass_exception5s rEcCst| o t|dS)Ncontribute_to_class)inspectisclasshasattr)valuer6r6r9_has_contribute_to_classCsrKcsHeZdZdZfddZddZddZedd Zed d Z Z S) ModelBasezMetaclass for all models.c# stj}dd|D}|s|||||S|d}d|i}|dd} | dur+| |d<|dd} i} |D]\} } t| rD| | | <q7| || <q7|||||fi|}t| dd}| pat|dd}t|dd}d}t|}t|d ddur|dur|std ||fn|j }| dt |||s| d t d t d d |Dptf||d| dt dt dd |Dptf||d|r|jst|ds|j|j_t|ds|j|j_|jj}|r|r|jrtd||jf| D] \} } | | | qt|jj|jj|jj}dd|D}|rad}dd|DD]-}|jjr/|jjr-td|q|dur8|}q|jj|jjurGtd|q|durTtd||j||jj|j_n||j_i}t|g|D]7}t|dsxqn||kr|jjsqn|jjD]}t |t!r|j"j#rt$||j"j%}||t&|<qqnt'}|(D]}||vst|ds|)|j*q|jj|jj}|jjs6|D]}|j+|vrt,d|j+||j-f|.|j+q|jj}t&|}||vr||}n0|s-d|jj/}t!|t0|ddd}||vr t,d|||j-ft||s,| ||nd}||jj1|<nI|jj12} |D]9}|j+|vrv|j+|j*vrv|j+|vrvt23|}!| |j+|!|j4rv| D]\}}"||"krt|!| |<qgq>|jj1)| |jjD]/}|j+|vr|jjst,d|j+||j-fqt23|}|jjsd|_5| |j+|qqdd|jj6D|j_6|rd| _| |_7|S|8|jj9|jj:||S) NcSsg|] }t|tr|qSr6) isinstancerL).0br6r6r9 Oz%ModelBase.__new__..r> __classcell__MetaabstractF_meta app_labelzfModel class %s.%s doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS. DoesNotExistcs(|]}t|dr|jjs|jVqdSrUN)rIrUrTrWrNxr6r6r9   z$ModelBase.__new__..)rDr csrXrY)rIrUrTr rZr6r6r9r\r]ordering get_latest_byz'%s cannot proxy the swapped model '%s'.cSsh|]}|jqSr6rArNfr6r6r9 sz$ModelBase.__new__..cSsg|] }t|dr|qS)rU)rI)rNklsr6r6r9rPrQzOAbstract 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.zRLocal field %r in class %r clashes with field of the same name from base class %r.z%s_ptrT) on_deleterA auto_created parent_linkztAuto-generated field '%s' in class %r for parent_link to base class %r clashes with declared field of the same name.cSsg|]}t|qSr6)copydeepcopy)rNidxr6r6r9rP6);super__new__popitemsrKgetattrrget_containing_app_config RuntimeErrorlabel add_to_classr%rEtupler r rTrIr^rUr_proxyswapped TypeErrorr local_fieldslocal_many_to_manyprivate_fieldsfieldsconcrete_model setup_proxyreversedrMr remote_fieldrgr"modelr-setmroupdate__dict__rAr r=add model_namerparentsrhri one_to_one mti_inheritedindexesrS_prepareregister_modelrV)#clsrArBattrskwargs super_newrrC new_attrs classcell attr_metacontributable_attrsobj_nameobj new_classrTmeta base_metarV app_configis_proxy new_fields field_namesbaseparent parent_linksfieldrelatedinherited_attributes parent_fieldsbase_key attr_name base_parents new_fieldrg __class__r6r9rmJsz                                         zModelBase.__new__cCs(t|r |||dSt|||dSN)rKrFsetattr)rrArJr6r6r9rtDszModelBase.add_to_classcCs|j}|||jr,t|jdd|_t|jdd|_|jjr,|j}|jj}t t |||j durBd|j d dd|jDf|_ tj|j}|rQt|d ||jsqtd d|jDretd |j t}d|_|d ||jjD] }|js||qutj|d dS)z7Create some methods once self._meta has been populated.T)is_nextFNz%s(%s), cs|]}|jVqdSrr`rar6r6r9r\_z%ModelBase._prepare..get_absolute_urlcss|]}|jdkVqdS)objectsNr`rar6r6r9r\fzOModel %s must specify a custom Manager, because it has a field named 'objects'.r)sender)rUrorder_with_respect_tor_get_next_or_previous_in_orderget_next_in_orderget_previous_in_orderrrr!make_foreign_order_accessors__doc__r=joinr|rABSOLUTE_URL_OVERRIDESget label_lowerrmanagersany ValueErrorr$rfrtrrAset_name_with_modelr(send)roptswrtremoteget_absolute_url_overridemanagerindexr6r6r9rJs:   "    zModelBase._preparecC|jjSr)rU base_managerrr6r6r9 _base_managerxzModelBase._base_managercCrr)rUdefault_managerrr6r6r9_default_manager|rzModelBase._default_manager) r=r>r?rrmrtrpropertyrrrRr6r6rr9rLHs {. rLc@seZdZdddZdS)ModelStateFieldsCacheDescriptorNcCs|dur|Si}|_|Sr) fields_cache)r8instancerresr6r6r9__get__s z'ModelStateFieldsCacheDescriptor.__get__r)r=r>r?rr6r6r6r9rsrc@seZdZdZdZdZeZdS) ModelStatezStore model instance state.NT)r=r>r?rdbaddingrrr6r6r6r9rs  rcsheZdZfddZeddZddZddZd d Zd d Z d dZ ddZ ddZ dtddZ ddZee eZddZduddZddZ  dvdd Zd!e_  dwd"d#Zd!e_d$d%Z  dxd&d'Zd(d)Zd*d+Zd,d-Zdyd.d/Zd!e_d0d1Zd2d3Zd4d5Zd6d7Z d8d9Z!dtd:d;Z"dtdd?Z$d@dAZ%dBdCZ&dDdEZ'dzdFdGZ(dtdHdIZ)edJdKZ*edLdMZ+edNdOZ,edPdQZ-edRdSZ.edTdUZ/edVdWZ0edXdYZ1edZd[Z2ed\d]Z3ed^d_Z4ed`daZ5edbdcZ6edddeZ7edfdgZ8edhdiZ9edjdkZ:edldmZ;edndoZZ?S){Modelc sf|j}|j}t}t}|jrtdtj|||dt|_ t |t |j kr*t d|sHt |j }t||D]\}} ||ur?q6||| j|q6n"t |j}t||D]\}} ||ur[qR||| j||| jdqR|D]t} d} | j|vr{| jdur{ql|rt| jtrz || j} d} Wn9tyz|| j}Wn ty| }YnwYnwz|| j}Wnty| }Ynw| }| r| |ur||| j| ql||ur||| j|ql|r%|j} t|D],} z| | vs|| r || |ur||| || || =WqttfyYqw|D] }td|j|ft t!j||ddS)Nz'Abstract models cannot be instantiated.)rargsrz'Number of args exceeds number of fieldsFTz,%s() got an unexpected keyword argument '%s')rr)"rrUrDEFERREDrTrxr+rr_statelenconcrete_fields IndexErroriterzipattnamer|rnrAcolumnrMrrKeyError get_default_property_namesru get_fieldAttributeErrorrr=rl__init__r))r8rrrr_setattr _DEFERRED fields_itervalris_related_objectrel_objproperty_namespropkwargrr6r9rs           zModel.__init__csPt|t|jjkrt|fdd|jjD}||}d|j_||j_|S)Ncs"g|] }|jvr tntqSr6)rnextrrar values_iterr6r9rPsz!Model.from_db..F)rrUrrrrr)rrrvaluesnewr6rr9from_dbs z Model.from_dbcCsd|jj|fS)Nz<%s: %s>)rr=r7r6r6r9r:szModel.__repr__cCsd|jj|jfS)Nz%s object (%s))rr=pkr7r6r6r9r< sz Model.__str__cCsBt|tstS|jj|jjkrdS|j}|dur||uS||jkSNF)rMrNotImplementedrUr}r)r8othermy_pkr6r6r9__eq__s  z Model.__eq__cCs|jdur tdt|jS)Nz8Model instances without primary key value are unhashable)rrxhashr7r6r6r9__hash__s  zModel.__hash__cCs.|}tj|t<|jj|jjf}t|f|fSr) __getstate__django __version__rrUrV object_namemodel_unpickle)r8dataclass_idr6r6r9 __reduce__s  zModel.__reduce__cCs|j}t|d|d<|dj|d_g}|D]\}}t|tr0||t|fq|rC||d<|D] \}}||q9|S)z0Hook to allow choosing the attributes to pickle.r_memoryview_attrs) rrhrrorM memoryviewappendbytesrn)r8stater attrrJr6r6r9r#s    zModel.__getstate__cCs||t}|r|tjkrtjd|tjftddntjdtddd|vr6|dD] \}}t|||<q+|j |dS)NzQPickled model instance's Django version %s does not match the current version %s.) stacklevelz9Pickled model instance's Django version is not specified.r ) rrrrwarningswarnRuntimeWarningrnr rr)r8rpickled_versionrrJr6r6r9 __setstate__4s(  zModel.__setstate__NcCs|p|j}t||jjSr)rUrprr)r8rr6r6r9 _get_pk_valJs zModel._get_pk_valcCsD|jjD]}|r||jjkrt||jj|qt||jjj|Sr)rUrrrr target_fieldr)r8rJrgr6r6r9 _set_pk_valNs zModel._set_pk_valcsfddjjDS)zU Return a set containing names of deferred fields for this instance. csh|] }|jjvr|jqSr6)rrrar7r6r9rcZs  z,Model.get_deferred_fields..)rUrr7r6r7r9get_deferred_fieldsVs zModel.get_deferred_fieldsc s\|duri|_n*t|dd}|D]}||vr||=||q|s#dStdd|Dr2tdtd|i}|jjj||dj |j d }| |durVt |}|j |}nrhfd d |jjD}|j |}|}| }|jjD] }|j|vr|qtt||jt||j|jr||r||qt|jjD] }||r||q|jj|j_dS) 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_cacher6css|]}t|vVqdSrrrar6r6r9r\xz(Model.refresh_from_db..zRFound "%s" in fields argument. Relations and transforms are not allowed in fields.r)hintsrcsg|] }|jvr|jqSr6)rradeferred_fieldsr6r9rPs z)Model.refresh_from_db..)rrpremoverrrrr db_managerfilterrrlistonlyrUrrrr is_relation is_cacheddelete_cached_valuerelated_objectsrr) r8usingr|prefetched_objects_cacherrdb_instance_qs db_instancenon_loaded_fieldsr6r r9refresh_from_db_sN          zModel.refresh_from_dbcCs:z|j|}Wntyt||YSwt||jS)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. )rUrrrpr)r8 field_namerr6r6r9serializable_values    zModel.serializable_valueFc Cs$|jdd|ptj|j|d}|r|s|rtd|}|durZ|s&dSt|}t}|jj D]}|j sH| |j |j |j krH| |j q1||}|rYtdd|n-|s|r||jjkrt}|jj D]}|j s{t|ds{| |j qk||} | rt| }|j||||d dS) 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_namerz6Cannot force both insert and updating in model saving.Nz_The following fields do not exist in this model, are m2m fields, or are non-concrete fields: %srthrough)r+ force_insert force_update update_fields) _prepare_related_fields_for_saver db_for_writerrr frozensetrrUr primary_keyrrAr differencerrrrI save_base) r8r7r8r+r9r!rrnon_model_fields loaded_fieldsr6r6r9r3sH            z Model.saveTc Cs|p tj|j|d}|r|s|rJ|dus|sJ|j}}|jjr'|jj}|j}|js7tj|||||d|j rBt j |dd} nt j |d} | d} |sV| |||} ||||p]| |||} Wdn1slwY||j_d|j_|jstj||| |||ddSdS)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. r5N)rrrawr+r9F)r+ savepointr+)rrcreatedr9rBr+)rr;rrUrvr}rfr,rrratomicmark_for_rollback_on_error _save_parents _save_tablerrrr*) r8rBr7r8r+r9roriginrcontext_managerparent_insertedupdatedr6r6r9r?s@      zModel.save_basec Cs|j}d}|jD]Q\}}|r/t||jjjdur/t||jdur/t||jjjt||j|j|||d}|j||||d} | sDd}|r[t||j| |j| |r[| |q |S)z3Save all the parents of cls using values from self.FN)rr+r9)rr+r9r7T) rUrrorprrrrHrIrr(r)) r8rr+r9rinsertedrrrLrMr6r6r9rHs&  zModel._save_parentscs|jddjD}rfdd|D}}|dur-j}tjj||du} | s;|s7r;tdd} sQ|sQjj rQjj rQjj t urQd}| r|s|j |} fdd|D} ph|} | ||| | } |r{| s{td r| std | sjrj}|}|j |jdi|jtttd td td tddd_j}| sfdd|D}j}|j |||}|rt|d|D] \}}t|j|q| S)zp Do the heavy-lifting involved in saving. Update or insert the data for a single table. cSsg|]}|js|qSr6r=rar6r6r9rP=rkz%Model._save_table..cs$g|]}|jvs|jvr|qSr6)rArra)r9r6r9rP@sNz5Cannot force an update in save() with no primary key.FTcs.g|]}|drt|jn|dfqSr)rprr,ra)rBr8r6r9rPWs&z&Forced update did not affect any rows.z0Save with update_fields did not affect any rows._order) output_fieldr) _order__maxrScsg|] }|jur|qSr6) auto_fieldra)rr6r9rPnrQr6)rUlocal_concrete_fieldsrrget_pk_value_on_saverrrrrdefaultrrr+ _do_updaterrget_filter_kwargs_for_objectr$ aggregater#rrrrrPdb_returning_fields _do_insertr)r8rBrr7r8r+r9non_pkspk_valpk_setrMbase_qsr forced_updater filter_argsr|returning_fieldsresultsrJr6)rrBr8r9r9rI6sp       zModel._save_tablecCsX|j|d}|s|dup|S|jjr%|s%|o$||dkp$|S||dkS)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). rNr)r$existsrUselect_on_save_update)r8r`r+r^rr9rafilteredr6r6r9rXws   zModel._do_updatecCs|j|g||||dS)z Do an INSERT. If returning_fields is defined then this method should return the newly created data for the model. )r|rcr+rB)_insert)r8rr+r|rcrBr6r6r9r\szModel._do_insertcCs|jjD]O}|jrS||rSt||jd}|sq|jdur0|jjs'|j |t d||jft||j |j vrAt ||j |jt||jj t||j krS| |qdS)NzH%s() prohibited to prevent data loss due to unsaved related object '%s'.)rUrr'r(rprArrmultipler)rr empty_valuesrr)r8r4rrr6r6r9r:s&    z&Model._prepare_related_fields_for_savecCsZ|p tj|j|d}|jdusJd|jj|jjjft|d}|j|g|d| S)Nr5zC%s object can't be deleted because its %s attribute is set to None.rD) keep_parents) rr;rrrUrrrcollectdelete)r8r+rl collectorr6r6r9rns  z Model.deletecCs2t||j}tt|j}t|t||ddS)NT) strings_only)rprdictr/ flatchoicesr.r)r8rrJ choices_dictr6r6r9_get_FIELD_displays zModel._get_FIELD_displayc Ks|jstd|r dnd}|rdnd}t||j}td id|j|f|i}|td i|j|d||jiB}|jj|j j j d i| | d||jfd |}z|d WSt yk|d |jjjw) Nz8get_next/get_previous cannot be used on unsaved objects.gtlt-%s__%szpk__%sz%s%sz%spkrz!%s matching query does not exist.r6)rrrprr'rArrr+rrr$order_byrrWrUr) r8rrroporderparamqqsr6r6r9_get_next_or_previous_by_FIELDs   "$  z$Model._get_next_or_previous_by_FIELDc Csd|}t||sR|r dnd}|rdnd}|jj}||}|jjjdi|jdid||jjdjdi|jjj |jii |dd }t |||t ||S) Nz__%s_order_cacherurvrPz-_orderz _order__%srQr6)rIrUrrYrrr$rrrArzrrrp)r8r cachenamer{r| order_fieldrbrr6r6r9rs"        z$Model._get_next_or_previous_in_ordercCs(|jdur td|t||jjS)Nz9Unsaved model instance %r cannot be used in an ORM query.)rrrprget_related_fieldr)r8rr6r6r9prepare_database_saves  zModel.prepare_database_savecCr4)aI 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. Nr6r7r6r6r9cleansz Model.cleancCsX|j|d\}}||}||}|D] \}}||g|q|r*t|dS)zh Check unique constraints on the model and raise ValidationError if any failed. excludeN)_get_unique_checks_perform_unique_checks_perform_date_checksro setdefaultextendr )r8r unique_checks date_checkserrors date_errorskvr6r6r9validate_uniques  zModel.validate_uniquecsdurgg}|j|jjfg}|j|jjfg}|jD]}|jjr,|||jjf|jjr9|||jjfq|D]\}}|D]}tfdd|DsX||t|fqBq<|D]\}} | D]} tfdd| jDsx||| jfqbq\g} |j|jj fg} |jD] }| ||jj fq| D]R\}} | D]K}|j }|vrq|j r|||ff|j r|j vr| |d||j f|j r|j vr| |d||j f|jr|jvr| |d||jfqq|| fS)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. Nc3|]}|vVqdSrr6rNrArr6r9r\&rz+Model._get_unique_checks..c3rrr6rrr6r9r\,rdateyearmonth)rrUunique_togethertotal_unique_constraintsget_parent_listr rrur|ryrAuniqueunique_for_dateunique_for_yearunique_for_month)r8rrunique_togethers constraints parent_class model_classrcheckmodel_constraints constraintrfields_with_classr|rbrAr6rr9rsZ     zModel._get_unique_checksc Csi}|D]v\}}i}|D])}|j|}t||j}|dus&|dkr'tjjr'q |jr/|jj s/q ||t |<q t |t |kr?q|j j di|} ||j} |jj s\| dur\| j| d} | rzt |dkrk|d} nt} || g|||q|S)NrwrrQrr6)rUrrprrfeatures!interprets_empty_strings_as_nullsr=rrstrrrr$rrrerrr unique_error_message) r8rrr unique_check lookup_kwargsr1rb lookup_valuermodel_class_pkkeyr6r6r9rHs2       zModel._perform_unique_checksc Csi}|D]i\}}}}i}t||}|durq|dkr0|j|d|<|j|d|<|j|d|<n t|||d||f<t||||<|jjdi|} |jjs[|jdur[| j |jd} | rm| |g | |||q|S)Nrz%s__dayz %s__monthz%s__yearryrr6)rpdayrrrr$rrrrrerr date_error_message) r8rrr lookup_typer unique_forrrrr6r6r9rus*   zModel._perform_date_checksc CsL|j}||}t|jdd|t|j||t|j|t||jddS)Nr)rrrr field_label date_fielddate_field_labelmessagecodeparams)rUrr error_messagesr0 verbose_name)r8rr1rrrr6r6r9rs zModel.date_error_messagecs|j||tj|d}t|dkr+|d}t|j|d<t|jdd|dSfdd|D}t|td |d <ttd d |dS) N)rrrrrQrrrrcsg|] }t|jqSr6)r0rrrarr6r9rPz.Model.unique_error_message..and field_labelsz9%(model_name)s with this %(field_labels)s already exists.r) rUr0rrrr rr1_)r8rrrrrr6rr9rs* zModel.unique_error_messagec Csi}|dur g}nt|}z|j|dWnty,}z ||}WYd}~nd}~wwz|WntyJ}z ||}WYd}~nd}~ww|r|D]}|tkr^||vr^||qOz|j|dWnty~}z ||}WYd}~nd}~ww|rt|dS)z Call clean_fields(), clean(), and validate_unique() on the model. Raise a ValidationError for any errors that occur. Nr)r% clean_fieldsr update_error_dictrrr r)r8rrrerAr6r6r9 full_cleans<  zModel.full_cleanc Cs|durg}i}|jjD]<}|j|vrq t||j}|jr#||jvr#q z t||j|||Wq t yH}z |j ||j<WYd}~q d}~ww|rOt |dS)z Clean all fields and raise a ValidationError containing a dict of all validation errors if any occur. N) rUr|rArprblankrkrrr error_list)r8rrrb raw_valuerr6r6r9rs$   zModel.clean_fieldscKsg|||jdi|}|jjsu|dpg}|g|jdi||||7}g| | | | | R}|||sW|||g||||||||7}|S)N databasesr6)_check_swappable _check_model_check_managersrUrwr _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_index_together_check_unique_together_check_indexes_check_ordering_check_constraints_check_default_pk)rrrr clash_errorsr6r6r9rsL$  z Model.checkcCsz|jjs;|jjjr;t|jjtr|jjjjs;t ds;|jj r;|jj j s;t j dtjdd|jj jjd|ddgSgS)NDEFAULT_AUTO_FIELDzPAuto-created primary key used when not defining a primary key type, by default 'z'.z0Configure the DEFAULT_AUTO_FIELD setting or the zh.default_auto_field attribute to point to a subclass of AutoField, e.g. 'django.db.models.BigAutoField'.z models.W042hintrid)rUrTrrfrMr rrgr is_overriddenr!_is_default_auto_field_overriddenrWarningrrr?rr6r6r9rs4      zModel._check_default_pkc Csg}|jjrLz t|jjW|Sty(|tjd|jjddY|St yK|jj d\}}|tjd|jj||fddY|Sw|S)z"Check if the swapped model exists.z-'%s' is not of the form 'app_label.app_name'.z models.E001r.zF'%s' references '%s.%s', which has not been installed, or is abstract.z models.E002) rUrwr get_modelrr rError swappable LookupErrorsplit)rrrVrr6r6r9r>s6      zModel._check_swappablecCs:g}|jjr|jjs|jjr|tjd|jdd|S)Nz'Proxy model '%s' contains model fields.z models.E017r)rUrvryrzr rrr=rrr6r6r9rYszModel._check_modelcKs,g}|jjD] }||jdi|q|S)zPerform all manager checks.Nr6)rUrrr)rrrrr6r6r9rfs zModel._check_managerscKsTg}|jjD] }||jdi|q|jjD]}||jdd|i|q|S)zPerform all field checks. from_modelNr6)rUryrrrz)rrrrr6r6r9rns   zModel._check_fieldscCsg}g}|jj}dd|D}dd|D}|D])}|jj||jj|jjf}||vr<|tjd|jjjj |ddq||q|S)zL Check if no relationship model is used by more than one m2m field. cs"|] }t|jjtr|VqdSr)rMrrrLrar6r6r9r\ z=Model._check_m2m_through_same_relationship..csrr)rMrr6rLrar6r6r9r\rzWThe model has two identical many-to-many relations through the intermediate model '%s'.z models.E003rr) rUrzrrr6through_fieldsr rrrs)rrseen_intermediary_signaturesr|rb signaturer6r6r9rxs&  z*Model._check_m2m_through_same_relationshipcsHfddjjD}|r"|djs"jjjdkr"tjdddgSgS)z%Check if `id` field is a primary key.cs&g|]}|jdkr|jjkr|qSr)rArUrrarr6r9rPs&z)Model._check_id_field..rrzP'id' can only be used as a field name if the field also sets 'primary_key=True'.z models.E004r)rUryr=rrArr)rr|r6rr9rs zModel._check_id_fieldc CsNg}i}|jD]:}|jjD]3}||jp||jpd}|r8|tjd|j|j j|j|j jf|dd|||j<|||j<qq |jD]}|j D] }||vr[|||j<qPqI|jjD]C}||jpp||jppd}|jdko|o|jdko|j |k}|r|s|tjd|j|j|j jf|dd|||j<|||j<qa|S)z2Forbid field shadowing in multi-table inheritance.NzYThe field '%s' from parent model '%s' clashes with the field '%s' from parent model '%s'.z models.E005rrz;The field '%s' clashes with the field '%s' from model '%s'.z models.E006) rUrryrrArr rrr get_fields)rr used_fieldsrrbclash id_conflictr6r6r9rsV      " zModel._check_field_name_clashesc Cs`g}g}|jjD]%}|\}}|r(||vr(|tjd|j|fd|ddq||q|S)Nz>Field '%s' has column name '%s' that is used by another field.z$Specify a 'db_column' for the field.z models.E007r)rUryget_attname_columnr rrrA)rused_column_namesrrbr column_namer6r6r9rs"    z Model._check_column_name_clashescCsbg}|j}|ds|dr|tjd||dd|St|vr/|tjd||dd|S)NrzgThe model name '%s' cannot start or end with an underscore as it collides with the query lookup syntax.z models.E023rzbThe model name '%s' cannot contain double underscores as it collides with the query lookup syntax.z models.E024)r= startswithendswithr rrr)rrrr6r6r9rs0z)Model._check_model_name_db_lookup_clashescCsTg}|jj}dd|jjddD}|D]}||vr'|tjd||ddq|S)Ncss(|]}|jr|jdur|VqdSr)r' related_model get_attnamerar6r6r9r\s zLModel._check_property_name_related_field_accessor_clashes..Freversez8The property '%s' clashes with a related field accessor.z models.E025r)rUr _get_fieldsr rr)rrrrelated_field_accessorsaccessorr6r6r9rs$ z9Model._check_property_name_related_field_accessor_clashescCs8g}tdd|jjDdkr|tjd|dd|S)Ncss|]}|jrdVqdS)rQNrOrar6r6r9r\*rz2Model._check_single_primary_key..rQzBThe model cannot have more than one field with 'primary_key=True'.z models.E026r)sumrUryr rrrr6r6r9r'szModel._check_single_primary_keycCtt|jjttfstjd|ddgStdd|jjDr&tjd|ddgSg}|jjD] }|| |dq,|S) z+Check the value of "index_together" option.z)'index_together' must be a list or tuple.z models.E008rcs |] }t|ttf VqdSrrMrur%rNr|r6r6r9r\Az.Model._check_index_together..z6All 'index_together' elements must be lists or tuples.z models.E009index_together) rMrUr rur%rrrr_check_local_fieldsrrr|r6r6r9r5$ zModel._check_index_togethercCr) z,Check the value of "unique_together" option.z*'unique_together' must be a list or tuple.z models.E010rcsrrrrr6r6r9r\\r z/Model._check_unique_together..z7All 'unique_together' elements must be lists or tuples.z models.E011r) rMrUrrur%rrrrr r r6r6r9rPr zModel._check_unique_togetherc Csg}t}|jjD]M}|jddks|jdr'|tjd|j|ddt|j|j kr@|tjd|j|j f|dd|j rV|j D]}| dd | |DqFq |D]y}t||sbqYt|}|jjsd |jjvstd d |jjDr|tjd |jd |dd|jjsd|jjvstdd |jjDr|tjd|jd|dd|jjsd|jjvstdd |jjDr|tjd|jd|ddqYdd|jjD}|dd|jjD7}||7}|||d|S)z/Check fields, names, and conditions of indexes.rrz@The index name '%s' cannot start with an underscore or a number.z models.E033rz8The index name '%s' cannot be longer than %d characters.z models.E034css|]}|dVqdS)rNr6)rNrefr6r6r9r\s z'Model._check_indexes..supports_partial_indexescss|]}|jduVqdSr) conditionrNrr6r6r9r\rz,%s does not support indexes with conditions.zLConditions will be ignored. Silence this warning if you don't care about it.z models.W037rsupports_covering_indexescsrrincluderr6r6r9r\rz1%s does not support indexes with non-key columns.zQNon-key columns will be ignored. Silence this warning if you don't care about it.z models.W040supports_expression_indexescsrr)contains_expressionsrr6r6r9r\rz+%s does not support indexes on expressions.zKAn index won't be created. Silence this warning if you don't care about it.z models.W043cSs g|] }|jD]\}}|qqSr6) fields_orders)rNrrrr6r6r9rPs z(Model._check_indexes..cSsg|] }|jD]}|qqSr6r)rNrrr6r6r9rPrr)rrUrrAisdigitr rrrmax_name_lengthr expressionsr_get_expr_referencesrallow_migrate_modelrrrrequired_db_featuresrr display_namerrrr ) rrr referencesr expressionrrr|r6r6r9rks            zModel._check_indexesc Csddlm}i}|jjddD]}|||j<t|dr |||j<qg}|D]R}z||}WntyE|t j d||f|ddYq%wt |j |j r^|t j d |||f|d dq%||jjvrw|t j d |||jjfd |d dq%|S)Nr)modelsFrrz*'%s' refers to the nonexistent field '%s'.z models.E012rzV'%s' refers to a ManyToManyField '%s', but ManyToManyFields are not permitted in '%s'.z models.E013z;'%s' refers to field '%s' which is not local to model '%s'.z4This issue may be caused by multi-table inheritance.z models.E016r) django.dbr!rUrrArIrrr rrrMr ManyToManyRelryr)rr|optionr!forward_fields_maprrr1r6r6r9r s\          zModel._check_local_fieldsc Cs|jjr tjd|ddgS|jjs|jjsgSt|jjttfs)tjd|ddgSg}|jj}dd|D}dd|D}g}g}|D]}t |vrO| |qC| |qC|}|D]W}|}d }| t D]K} z| d krp|jj }n|j | }|jr|d jj}nd }Wqdttfy|d us|| d ur|| d ur| tjd ||d dYqdwqYdd|D}g} |j} ttddt| j| jD} | || | D]} | tjd | |d dq|S)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.E021rzQ'ordering' must be a tuple or list (even if you want to order by only one field).z models.E014css&|]}t|tr|dkr|VqdS)?N)rMrrar6r6r9r\s$z(Model._check_ordering..css*|]}|dr|ddn|VqdS)rxrQN)rrar6r6r9r\s(NrzJ'ordering' refers to the nonexistent field, related field, or lookup '%s'.z models.E015cSsh|]}|dkr|qSrr6rar6r6r9rcBsz(Model._check_ordering..css4|]}|jr |jr|j|jfn|jfVqdSr)rfconcreterArrrelated_query_namerar6r6r9r\Js " )rU_ordering_clashrrrr^rMr%rurr rrrr' get_path_infoto_optsrrr get_transform get_lookuprr from_iterabler|r*r)rrr|_fieldsrelated_fieldsrbr_clsfldpartinvalid_fieldsr valid_fields invalid_fieldr6r6r9rs       zModel._check_orderingc CsX|sgSg}d}d}|D],}t||sq t|}|j}|dus&|jjr'q |dur0|}|}q ||kr8|}|}q |dur?|S|jjD](}| \} } |j durk| durkt | |krk| t jd| ||fd|ddqC|jjD]9}t|jjtrzqp|jjjjD](} | \} } | j dur| durt | |kr| t jd| ||fd|ddqqp|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 "%s". Maximum length is "%s" for database "%s".z/Set the column name manually using 'db_column'.z models.E018rz`Autogenerated column name too long for M2M field "%s". Maximum length is "%s" for database "%s".z\Use 'through' to create a separate model for M2M and then set column_name using 'db_column'.z models.E019)rrropsrrtruncates_namesrUryr db_columnrr rrrzrMrr6r) rrr allowed_lendb_aliasrrrrbrrm2mrel_namer6r6r9r\sl      zModel._check_long_column_namesccst|tr0|jD]$}t|tr%|\}}t|tV||EdHq ||EdHq dSt|tr@t|jtVdSt |drT| D] }||EdHqIdSdS)Nget_source_expressions) rMr'childrenrurrrr&rArIr?)rexprchildlookuprJsrc_exprr6r6r9rs       zModel._get_expr_referencesc Csg}|D]n}t||sqt|}|jjs6d|jjvs6tdd|jjDr6| t j d|j d|dd|jj sZd|jjvsZtd d|jjDrZ| t j d |j d|d d|jjs~d |jjvs~td d|jjDr~| t j d|j d|dd|jjsd|jjvstdd|jjDr| t j d|j d|ddttdd|jjD}t}|jjD]?}t|tr|jj sd|jjvrt|jtr|||jqt|tr|jjsd|jjvrt|jtr|||jq|D]p^}} |dkr||| s qz |dkr|jj} n|j|} | jr(| js(| j r*WqWn t!y5Yqw| d} t"| drit"| dri| #| duri| $| duri| t j%dt&'|g| |ddq|(|)|dq|S)N supports_table_check_constraintscss|]}t|tVqdSr)rMrrNrr6r6r9r\s  z+Model._check_constraints..z&%s does not support check constraints.zOA constraint won't be created. Silence this warning if you don't care about it.z models.W027rrcs$|] }t|to |jduVqdSr)rMrrrFr6r6r9r\  z7%s does not support unique constraints with conditions.z models.W036&supports_deferrable_unique_constraintscsrGr)rMr deferrablerFr6r6r9r\rHz2%s does not support deferrable unique constraints.z models.W038rcss |] }t|to |jVqdSr)rMrrrFr6r6r9r\s  z<%s does not support unique constraints with non-key columns.z models.W039css,|]}t|trg|j|jRVqdSr)rMrr|rrFr6r6r9r\ s   rrr-r.z.'constraints' refers to the joined field '%s'.z models.E041rr)*rrrrrErUrrrr rrrrrIrrrr/rMrrr'rrrrrrrr' many_to_many one_to_manyrrIr-r.rrrrr ) rrrrrr|rrr1lookupsr first_lookupr6r6r9rs                        zModel._check_constraintsr)NN)FFNN)FFFNN)FNFFNNr)NT)@r=r>r?r classmethodrr:r<rrr rrrrrrrr0r2r3 alters_datar?rHrIrXr\r:rnrtrrrrrrrrrrrrrrrrrrrrrrrrrrrrr rrrrrRr6r6rr9rs e      = 8 1 A "  :-  $         8       X 1 e J r) metaclasscsV|durt}jj}||}j|jdi|fddt|DdgdS)Ncsg|] \}}||dqS))rrPr6)rNr|r ordered_objr6r9rPJsz$method_set_order..rPr6) r rUrget_forward_related_filterrr#r$ bulk_update enumerate)r8rSid_listr+ order_wrtrbr6rRr9method_set_orderEs "rYcCs8|jj}||}|jjj}|jjdi|j|ddS)NT)flatr6)rUrrTrrArr$ values_list)r8rSrXrbpk_namer6r6r9method_get_orderOs  r]cCs<t|d|jtt|t|d|jtt|dS)Nz get_%s_orderz set_%s_order)rr=lowerrr]rY)rrr6r6r9rVs  rcCs$t|tr tj|}n|}||S)z7Used to unpickle Model subclasses with deferred fields.)rMrurrrm)model_idrr6r6r9rgs   rTr)YrhrGr functoolsr itertoolsrr django.appsr django.confr django.corerdjango.core.exceptionsrrr r r r r"r rrrrrrdjango.db.modelsrrrrrdjango.db.models.constantsrdjango.db.models.constraintsrrdjango.db.models.deletionrrdjango.db.models.fields.relatedrr 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.utilsr-django.utils.encodingr.django.utils.hashabler/django.utils.textr0r1django.utils.translationr2rr3rrErKr@rLrrrrYr]rr__safe_for_unpickle__r6r6r6r9sl      $        ;  >