Django 관계 유형 필드

9138 단어
약술
본문은 모두 세 종류로 나뉘는데, 각각
  • 멀티 페어(ForeignKey)
  • 멀티 쌍(ManyToManyField)
  • 일대일(OneToOneField)
  • 그 중에서 가장 많이 사용하는 것은 보통 외부 키이고 본고의 중점이다. 만약에 당신이 Django를 배우고 있거나 Django를 배울 준비를 하고 있다면 본고는 당신에게 매우 중요할 것이다. 자세히 읽어 주십시오. 생략할 부분이 없습니다.
    외부 키ForeignKeyclass ForeignKey(to, on_delete, **options)
  • to: 관련 모델
  • on_delete: 연결 제거(2.0 이후 필수)
  • 일반적인 사용
    from django.db import models
    
    #              app ,       
    #  CreateCar appone , appone.CreateCar
    class Car(models.Model):
        create_car = models.ForeignKey(
            'CreateCar',  # here
            on_delete=models.CASCADE,
        )
    
    class CreateCar(models.Model):
        pass
    

    자체 귀속
    #          self (      )
    class Comment(models.Model):
        title = models.CharField(max_length=128)
        text = models.TextField()
        parent_comment = models.ForeignKey('self', on_delete=models.CASCADE)
    

    실제 데이터베이스 백그라운드에서 Django는 모든 외부 키에id 접미사를 만들고 데이터 테이블의 열을 만듭니다.
    중요 매개 변수
    이 칸을 단독으로 열거해야 하는 이유는 관계 유형의 필드에서 대부분이 같기 때문이다. 이 칸은 주로 키 파라미터이고 다른 다대다와 일대일 중에는 같은 파라미터가 많기 때문에 후속 두 칸에서 이 참수 그룹과 다른 부분만 열거한다.
    on_delete
    Django는 외부 키 연관 객체가 삭제되면 on_delete의 제약을 따릅니다.
    """
              
                  ,    null
            on_delete=models.CASCADE
    """
    user = models.ForeignKey(
        User,
        models.SET_NULL,
        blank=True,
        null=True,
    )
    

    이 매개 변수의 상수는 django.db.models.deletion.py에서 모든 상수를 볼 수 있다
  • CASCADE: 아날로그 SQL 언어의 ON DELETE CASCADE 제약, 외부 키가 정의된 모델 대상을 동시에 삭제합니다!(기본값 및 일반)
  • PROTECT: 삭제 작업을 막고 삭제 시 ProtectedError 이상
  • SET_NULL: 외키 필드를 null으로 설정하고 필드가 null=True으로 설정된 경우에만 이 값을 사용할 수 있습니다.
  • SET_DEFAULT: 키 필드를 기본값으로 설정합니다.필드에 default 매개 변수를 설정한 경우에만 사용할 수 있습니다.
  • DO_NOTHING: 아무것도 안 한다
  • SET(): SET()에 전달되는 값이나 리셋 함수의 리셋 값으로 설정합니다.
  • from django.conf import settings
    from django.contrib.auth import get_user_model
    from django.db import models
    
    def get_sentinel_user():
        return get_user_model().objects.get_or_create(username='deleted')[0]
    
    class MyModel(models.Model):
        user = models.ForeignKey(
            settings.AUTH_USER_MODEL,
            on_delete=models.SET(get_sentinel_user),
        )
    

    limit_choices_to
    이 매개 변수는 외부 키가 연결될 수 있는 대상을 제한하는 데 사용되며, DjangoModelForm(표 모듈)과 admin 백엔드에만 사용되며, 다른 장소에는 제한 기능이 없다.
    그 값은 dict, Q 대상(Q 및 F 참조) 또는 dict 또는 Q()으로 되돌아오는 함수 호출일 수 있다. 다음과 같다.
    # employee     is_employee=True Users  
    #       admin      。
    employee = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        limit_choices_to={'is_employee': True},
    )
    

    related_name
    연관된 객체의 역참조 모델 이름입니다.기본값은 NoneCar와 Createcar의 예로 설명하면 Createcar에서 Car와 연결된 관계의 이름을 반대로 바꾸는 것이다.
    이 매개변수는 설정하지 않아도 됩니다. 일반적으로 Django는 기본적으로 모델의 소문자를 역연관 이름으로 사용합니다.
    만약 외부 키에 역방향 관련 이름을 설정하고 싶지 않다면, 이 파라미터를 +으로 끝낼 수 있습니다
    user = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        related_name='+',
    )
    

    related_query_name
    연관된 질의를 대칭 이동합니다.
    대상 모델에서 필터 모델 객체의 이름을 대칭 이동하는 데 사용됩니다.
    class Tag(models.Model):
        article = models.ForeignKey(
            Article,
            on_delete=models.CASCADE,
            related_name="tags",
            related_query_name="tag",
        )
        name = models.CharField(max_length=255)
    
    #       ‘tag’      
    Article.objects.filter(tag_name="important")
    

    to_field
    기본적으로 외부 키는 연결된 대상에 연결된 메인 키입니다.to_field 매개 변수를 지정하면 지정한 필드에 연결할 수 있지만 이 필드는 유일해야 합니다(unique=True 속성)
    db_constraint
    데이터베이스 제약 조건에 따라 기본값은 TrueFalse으로 설정하면 데이터의 무결성과 합법성을 보장할 수 없습니다.
    특수한 경우에만 False으로 설정해야 합니다.
  • 역사적으로 남겨진 비합법적인 데이터
  • 데이터 테이블 분할 중
  • False이고 존재하지 않는 관계 대상을 방문하려고 시도할 때 DoesNotExist 이상이 발생합니다.
    여러 쌍의 ManyToManyField
    다대다관계는 데이터베이스에서도 매우 흔히 볼 수 있는 관계 유형이다.
    예를 들어 한 권의 책에는 여러 명의 작가가 있을 수 있고, 한 명의 작가도 몇 권의 책을 쓸 수 있다.
    다대다의 필드는 어느 쪽에서든 정의할 수 있습니다. 사람들의 사고 습관에 부합되는 쪽에 최대한 정의하지만 동시에 정의하지 마세요.
    다중 쌍 다중 관계식에는 연관된 객체 모델에 사용할 위치 매개변수가 필요합니다.그것의 용법과 외키는 차이가 많지 않다class ManyToManyField(to, **options)
    데이터베이스 백그라운드에서 Django는 실제적으로 다대다관계를 나타내는 중간표를 추가로 만들 것이다.
  • 기본적으로 이 테이블의 이름은 + + hashCode입니다. 예를 들어 author_books_9cdf410
  • db_table 옵션을 사용하여 테이블 이름을 사용자 정의할 수 있습니다.

  • 다중 쌍 다중 매개변수 설명
    외부 키 매개변수 부분을 참조합니다.
    related_name
    related_query_name
    db_constraint
    

    특별 설명
  • ManyToManyField은 Django에 내장된 validators 검증 기능을 지원하지 않습니다.
  • null 매개 변수는 ManyToManyField에 무효입니다!null=True을 설정하면 의미가 없습니다.
  • .
  • swappable 현재 외부 키가 교환 가능한 모델을 가리키면 이동 프레임워크의 동작을 제어할 수 있습니다.기본값은 True이며
  • 은 거의 사용하지 않음
  • limit_choices_tothrough 매개 변수를 사용하여 중간표를 사용자 정의하는 다중 필드에 무효이며, 기타 참조 키 매개 변수
  • symmetrical
    기본적으로 Django의 다대다 관계는 대칭적이며 이 매개 변수의 이름에서'대칭'을 뜻하는 것을 알 수 있다.
    from django.db import models
    
    class Person(models.Model):
        friends = models.ManyToManyField("self")
    

    Django는 만약에 내가 너의 친구라면 너도 나의 친구라고 생각한다. 이것은 일종의 대칭 관계이다
    Django는 Person 모델에 person_set 속성을 추가하여 연관을 대칭 이동할 수 없습니다.이러한 대칭 관계를 사용하지 않으려면 symmetricalFalse으로 설정하십시오.
    through
    중간표를 정의하고 특히 설명 중의 limit_choices_to 파라미터를 정의한다. 이것을 제외하고 다른 것은 모두 키 파라미터를 참조하면 through 파라미터는 다대다 특유의 것이고 다대다 관계에서 매우 중요하다는 것을 설명한다.
    다중 관계에 추가된 관련 테이블을 사용자 정의하려면 이 인자를 사용하십시오!매개변수 값은 중간 모델입니다.
    #           
        id ...     id ...      id 
    
    
    #           
        id ...     id ...      id ...        
    

    demo
    from django.db import models
    
    class Person(models.Model):
        name = models.CharField(max_length=50)
    
    class Group(models.Model):
        name = models.CharField(max_length=128)
        members = models.ManyToManyField(
            Person,
            through='Membership',  #       
            through_fields=('group', 'person'),  #        
        )
        
        
    #        
    #     Person Group        
    #      ‘   ’ ‘    ’   。
    class Membership(models.Model):  
        group = models.ForeignKey(Group, on_delete=models.CASCADE)
        person = models.ForeignKey(Person, on_delete=models.CASCADE)
        inviter = models.ForeignKey(  #        
            Person,
            on_delete=models.CASCADE,
            related_name="membership_invites",
        )
        #         
        invite_reason = models.CharField(max_length=64)
    

    through_fields Membership 모델에는 Person과 관련된 두 개의 외부 키가 포함되어 있어 Django는 그룹과 관련된 대상으로 무엇을 사용하는지 확정할 수 없습니다.따라서 이 예에서 관계를 정의하는 데 사용할 through_fields 매개 변수를 명시적으로 지정해야 한다.through_fields 매개 변수는 모듈 ('field1', 'field2')을 수신합니다
  • field1: 다중 관계를 정의하는 모델의 외키 필드를 가리키는 이름입니다. 여기는 Membership 중의 group 필드,
  • 필드입니다.
  • field2은 목표 모델의 외키 필드를 가리키는데 여기는 Membershipperson이지 inviter이 아니다.

  • 다시 통속적으로 말하면 through_fields 매개 변수는 중간 표 모델 Membership에서 어느 두 필드를 선택하여 관계 연결 필드로 하는지를 지정한다.
    db_table
    중간 테이블의 이름을 설정합니다.지정하지 않으면 기본값을 사용합니다.
    일대일 One ToOne Fieldclass OneToOneField(to, on_delete, parent_link=False, **options)[source]
    개념적으로 보면 일대일 관계는 unique=True 속성을 가진 외키 관계와 매우 유사하지만 역방향 관련 대상은 하나뿐이다.
    이런 관계 유형은 대부분 하나의 모델이 다른 모델에서 확장되어야 하는 상황에 사용된다.예를 들어 Django가 auth 모듈을 가지고 있는 User 사용자 테이블은 자신의 프로젝트에서 사용자 모델을 만들고 싶고 Django의 인증 기능을 편리하게 사용하고 싶다면 가장 좋은 방안은 사용자 모델에 일대일 관계를 사용하고auth 모듈 User 모델과 관련된 필드를 추가하는 것이다.
    이 관계의 to 매개 변수는 관련 모델로 그 사용법은 앞의 다대일 키와 같다.
    만약 일대일 관계에 related_name 파라미터를 설정하지 않았다면, Django는 현재 모델의 소문자를 기본값으로 사용할 것입니다.OneToOneField 일대일 관계는 다대일 키 관계와 같은 추가 선택 가능한 매개 변수를 가지고 있지만 parent_link 매개 변수가 하나 더 있을 뿐이다.
    from django.conf import settings
    from django.db import models
    
    #               Django   auth    User  
    class MySpecialUser(models.Model):
        user = models.OneToOneField(
            settings.AUTH_USER_MODEL,
            on_delete=models.CASCADE,
        )
        supervisor = models.OneToOneField(
            settings.AUTH_USER_MODEL,
            on_delete=models.CASCADE,
            related_name='supervisor_of',
        )
    

    이렇게 하면 User 모형은 아래의 속성을 가지게 됩니다
    >>> user = User.objects.get(pk=1)
    >>> hasattr(user, 'myspecialuser')
    True
    >>> hasattr(user, 'supervisor_of')
    True
    

    모듈 간 모형
    크로스 모듈의 모형에 대해 가져오면 사용할 수 있다

    좋은 웹페이지 즐겨찾기