o
    uvXjX'  ã                   @   sx   d Z ddlmZ ddlmZ ddlmZ ddlmZ G dd„ deƒZ	G d	d
„ d
e	ƒZ
G dd„ de
ƒZG dd„ de	ƒZdS )al  
"Rel objects" for related fields.

"Rel objects" (for lack of a better name) carry information about the relation
modeled by a related field and provide some utility functions. They're stored
in the ``remote_field`` attribute of the field.

They also act as reverse fields for the purposes of the Meta API because
they're the closest concept currently available.
é    )Ú
exceptions)Úcached_propertyé   )ÚBLANK_CHOICE_DASH)ÚFieldCacheMixinc                   @   s  e Zd ZdZdZdZdZdZdZ		d2dd„Z	e
dd„ ƒZe
d	d
„ ƒZedd„ ƒZedd„ ƒZe
dd„ ƒZe
dd„ ƒZe
dd„ ƒZe
dd„ ƒZe
dd„ ƒZdd„ Zdd„ Zedd„ ƒZdd „ Zded!fd"d#„Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd3d,d-„Zd3d.d/„Z d0d1„ Z!dS )4ÚForeignObjectRelzº
    Used by ForeignObject to store information about the relation.

    ``_meta.get_fields()`` returns this class to provide access to the field
    flags for the reverse relation.
    TFNc                 C   sF   || _ || _|| _|| _|d u ri n|| _|| _|| _d| _d| _d S )NFT)	ÚfieldÚmodelÚrelated_nameÚrelated_query_nameÚlimit_choices_toÚparent_linkÚ	on_deleteÚsymmetricalÚmultiple)Úselfr   Útor
   r   r   r   r   © r   úd/var/www/html/myproject/venv/lib/python3.10/site-packages/django/db/models/fields/reverse_related.pyÚ__init__%   s   
zForeignObjectRel.__init__c                 C   ó   |   ¡ S ©N)Ú	is_hidden©r   r   r   r   Úhidden6   ó   zForeignObjectRel.hiddenc                 C   ó
   | j  ¡ S r   )r   r   r   r   r   r   Úname:   s   
zForeignObjectRel.namec                 C   s   | j S r   )r   r   r   r   r   Úremote_field>   s   zForeignObjectRel.remote_fieldc                 C   s,   |   ¡ d j}t|ƒdkrt d¡‚|d S )z�
        When filtering against this relation, return the field on the remote
        model against which the filtering should happen.
        éÿÿÿÿr   z1Can't use target_field for multicolumn relations.r   )Úget_path_infoÚtarget_fieldsÚlenr   Ú
FieldError)r   r!   r   r   r   Útarget_fieldB   s   
zForeignObjectRel.target_fieldc                 C   s   | j jstdƒ‚| j jS )NzVThis property can't be accessed before self.field.contribute_to_class has been called.)r   r	   ÚAttributeErrorr   r   r   r   Úrelated_modelM   s
   ÿzForeignObjectRel.related_modelc                 C   ó   | j jS r   )r   Úmany_to_manyr   r   r   r   r(   T   r   zForeignObjectRel.many_to_manyc                 C   r'   r   )r   Úone_to_manyr   r   r   r   Úmany_to_oneX   r   zForeignObjectRel.many_to_onec                 C   r'   r   )r   r*   r   r   r   r   r)   \   r   zForeignObjectRel.one_to_manyc                 C   r'   r   )r   Ú
one_to_oner   r   r   r   r+   `   r   zForeignObjectRel.one_to_onec                 C   ó   | j  |¡S r   )r   Ú
get_lookup)r   Úlookup_namer   r   r   r-   d   ó   zForeignObjectRel.get_lookupc                 C   r   r   )r   Úget_internal_typer   r   r   r   r0   g   ó   
z"ForeignObjectRel.get_internal_typec                 C   r'   r   )r   Údb_typer   r   r   r   r2   j   r   zForeignObjectRel.db_typec                 C   s    dt | ƒj| jjj| jjjf S )Nz<%s: %s.%s>)ÚtypeÚ__name__r&   Ú_metaÚ	app_labelÚ
model_namer   r   r   r   Ú__repr__n   s
   ýzForeignObjectRel.__repr__r   c                 C   s$   |r|ng dd„ | j jj|Ž D ƒ S )a  
        Return choices with a default blank choices included, for use
        as <select> choices for this field.

        Analog of django.db.models.fields.Field.get_choices(), provided
        initially for utilization by RelatedFieldListFilter.
        c                 S   s   g | ]	}|j t|ƒf‘qS r   )ÚpkÚstr)Ú.0Úxr   r   r   Ú
<listcomp>}   s    ÿz0ForeignObjectRel.get_choices.<locals>.<listcomp>)r&   Ú_default_managerÚorder_by)r   Úinclude_blankÚblank_choiceÚorderingr   r   r   Úget_choicesu   s   ÿzForeignObjectRel.get_choicesc                 C   s   t | jƒo| jd dkS )z$Should the related object be hidden?r   ú+)Úboolr
   r   r   r   r   r   �   s   zForeignObjectRel.is_hiddenc                 C   r   r   )r   Úget_reverse_joining_columnsr   r   r   r   Úget_joining_columns…   r1   z$ForeignObjectRel.get_joining_columnsc                 C   s   | j  |||¡S r   )r   Úget_extra_restriction)r   Úwhere_classÚaliasÚrelated_aliasr   r   r   rH   ˆ   s   z&ForeignObjectRel.get_extra_restrictionc                 C   s
   d| _ dS )z³
        Set the related field's name, this is not available until later stages
        of app loading, so set_field_name is called from
        set_attributes_from_rel()
        N)Ú
field_namer   r   r   r   Úset_field_name‹   s   
zForeignObjectRel.set_field_namec                 C   sX   |r|j n| jj }|p| j}| jr| jr|| jkrd S | jr!| jS |j| jr)d S d S )NÚ_setÚ )r5   r&   r   r   r	   r
   r7   )r   r	   Úoptsr   r   r   Úget_accessor_name•   s   
z"ForeignObjectRel.get_accessor_namec                 C   r,   r   )r   Úget_reverse_path_info)r   Úfiltered_relationr   r   r   r    ¦   r/   zForeignObjectRel.get_path_infoc                 C   r   )z„
        Return the name of the cache key to use for storing an instance of the
        forward model on the reverse model.
        )rQ   r   r   r   r   Úget_cache_name©   s   zForeignObjectRel.get_cache_name©NNNFNr   )"r4   Ú
__module__Ú__qualname__Ú__doc__Úauto_createdÚconcreteÚeditableÚis_relationÚnullr   r   r   r   Úpropertyr   r$   r&   r(   r*   r)   r+   r-   r0   r2   r8   r   rC   r   rG   rH   rM   rQ   r    rT   r   r   r   r   r      sR    
ÿ













r   c                       s>   e Zd ZdZ		d‡ fdd„	Zdd„ Zdd	„ Zd
d„ Z‡  ZS )ÚManyToOneRela+  
    Used by the ForeignKey field to store information about the relation.

    ``_meta.get_fields()`` returns this class to provide access to the field
    flags for the reverse relation.

    Note: Because we somewhat abuse the Rel objects by using them as reverse
    fields we get the funny situation where
    ``ManyToOneRel.many_to_one == False`` and
    ``ManyToOneRel.one_to_many == True``. This is unfortunate but the actual
    ManyToOneRel class is a private API and there is work underway to turn
    reverse relations into actual fields.
    NFc	           	   	      s$   t ƒ j|||||||d� || _d S )N©r
   r   r   r   r   )Úsuperr   rL   ©	r   r   r   rL   r
   r   r   r   r   ©Ú	__class__r   r   r   À   s   ú
	zManyToOneRel.__init__c                 C   s   | j  ¡ }| dd ¡ |S )Nr&   )Ú__dict__ÚcopyÚpop)r   Ústater   r   r   Ú__getstate__Í   s   
zManyToOneRel.__getstate__c                 C   s*   | j j | j¡}|jst d| j ¡‚|S )zY
        Return the Field in the 'to' object to which this relationship is tied.
        zNo related field named '%s')r	   r5   Ú	get_fieldrL   rZ   r   ÚFieldDoesNotExist)r   r   r   r   r   Úget_related_fieldÒ   s   zManyToOneRel.get_related_fieldc                 C   s   | j p| jjjj| _ d S r   )rL   r	   r5   r9   r   r   r   r   r   rM   Û   s   zManyToOneRel.set_field_namerU   )	r4   rV   rW   rX   r   ri   rl   rM   Ú__classcell__r   r   rc   r   r_   ±   s    ÿ	r_   c                       s&   e Zd ZdZ		d‡ fdd„	Z‡  ZS )ÚOneToOneRelzº
    Used by OneToOneField to store information about the relation.

    ``_meta.get_fields()`` returns this class to provide access to the field
    flags for the reverse relation.
    NFc	           	   
      s&   t ƒ j||||||||d� d| _d S )Nr`   F)ra   r   r   rb   rc   r   r   r   ç   s   ú
	zOneToOneRel.__init__rU   )r4   rV   rW   rX   r   rm   r   r   rc   r   rn   ß   s
    ÿrn   c                       s0   e Zd ZdZ			d‡ fdd„	Zdd„ Z‡  ZS )	ÚManyToManyRelz¼
    Used by ManyToManyField to store information about the relation.

    ``_meta.get_fields()`` returns this class to provide access to the field
    flags for the reverse relation.
    NTc
           
         sR   t ƒ j|||||d� |r|	stdƒ‚|| _|r|stdƒ‚|| _|| _|	| _d S )N)r
   r   r   z4Can't supply a through model and db_constraint=Falsez5Cannot specify through_fields without a through model)ra   r   Ú
ValueErrorÚthroughÚthrough_fieldsr   Údb_constraint)
r   r   r   r
   r   r   r   rq   rr   rs   rc   r   r   r   ý   s   ü
zManyToManyRel.__init__c                 C   sV   | j j}| jr| | jd ¡}n|jD ]}t|ddƒ}|r%|j| jkr% nq|jd S )zŠ
        Return the field in the 'to' object to which this relationship is tied.
        Provided for symmetry with ManyToOneRel.
        r   r   N)rq   r5   rr   rj   ÚfieldsÚgetattrr	   Úforeign_related_fields)r   rP   r   Úrelr   r   r   rl     s   
€
zManyToManyRel.get_related_field)NNNTNNT)r4   rV   rW   rX   r   rl   rm   r   r   rc   r   ro   õ   s    þro   N)rX   Údjango.corer   Údjango.utils.functionalr   rO   r   Úmixinsr   r   r_   rn   ro   r   r   r   r   Ú<module>   s     .