Django Model 다중 테이블 쿼리

4661 단어
다중 테이블 조회는 모델 층의 중요한 기능 중 하나로 Django는 관련 필드를 바탕으로 하는 독특한 해결 방안을 제공했다.
ForeignKey
Django 공식 문서의 모델 예:
from django.db import models

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

class Author(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField()

class Entry(models.Model):
    blog = models.ForeignKey(Blog)
    authors = models.ManyToManyField(Author)
    headline = models.CharField(max_length=255)
    body_text = models.TextField()
    pub_date = models.DateField()
    mod_date = models.DateField()
    n_comments = models.IntegerField()
    n_pingbacks = models.IntegerField()
    rating = models.IntegerField()

class ForeignKey
ForeignKey 필드는 참조된 필드와 동일한 유형의 모델 클래스를 매개변수로 사용합니다.
 blog = models.ForeignKey(Blog)

ForeignKey.to_field
연관된 연관된 객체의 필드 이름입니다.기본적으로 Django는 연관된 객체의 기본 키를 사용합니다.
blog = models.ForeignKey(Blog, to_field=Blog.name)

ForeignKey.db_constraint
Django Model의ForeignKey 필드의 주요 기능은 관련 조회를 위해 일대다 관계를 유지하는 것입니다.db_constraint=True에 있을 때만 Django 모델은 데이터베이스에 키 제약을 세울 수 있고 이 값이False일 때에는 제약을 세울 수 없습니다.
기본값db_constraint=True.
ForeignKey.related_name
이 이름은 연결된 대상을 원본 대상으로 되돌리는 데 사용됩니다.
Django가 역방향 연결을 만들지 않으려면 related 를 설정하십시오name이'+'또는'+'로 끝납니다.ForeignKey.related_query_nameForeignKey.related_name를 기본값으로 하고 두 기능에 대한 구체적인 설명은 관련 문서를 참조하십시오.
ForeignKey 쿼리 사용
전방향 조회
관계 모델 A에 모델 B와 연관된 연관 필드가 있는 경우 모델 A의 인스턴스는 연관 필드를 통해 연관된 모델 B의 인스턴스에 액세스할 수 있습니다.
>>> e = Entry.objects.get(id=2)
>>> e.blog # Returns the related Blog object.

e.blog 수정 및 save 방법을 사용하여 데이터베이스에 저장
>>> e.blog = some_blog
>>> e.save()

ForeignKey 필드에 null=True 설정이 있다면, NULL 값을 허용하는 None을 분배해서 대응하는 관련성을 삭제할 수 있습니다
>>> e = Entry.objects.get(id=2)
>>> e.blog = None
>>> e.save() # "UPDATE blog_entry SET blog_id = NULL ...;"

Django는 이중 밑줄__을 사용하는 질의 구문을 제공합니다.
>>> Entry.objects.filter(blog__name='Beatles Blog')

역방향 조회
색인된 관계 모델은 해당 모델을 참조하는 모든 모델의 인스턴스(예: Entry)에 액세스할 수 있습니다.blog는 Blog의 외부 키로서 기본적으로 Blog.entry_set은 모든 참조 Blog의 Entry 예제를 포함하는 질의 세트로, 질의 세트 API를 사용하여 해당 인스턴스를 체크 아웃할 수 있습니다.
>>>b = Blog.objects.get(id=1)
>>>b.entry_set.all()

Entry.blog의 relatedname 및 relatedquery_name은 이 조회 집합의 이름을 설정할 수 있습니다.
ManyToManyField
Django 공식 홈페이지의 예:
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'))

class Membership(models.Model):
    group = models.ForeignKey(Group)
    person = models.ForeignKey(Person)
    inviter = models.ForeignKey(Person, related_name="membership_invites")
    invite_reason = models.CharField(max_length=64)
    

class ManyToManyField
ManyToManyField.through
Django는 자동으로 테이블을 생성하여 여러 쌍의 관계를 관리합니다. 연관 테이블을 수동으로 지정하려면 through 키워드 매개변수를 사용해야 합니다.
ManyToManyField.through_fields
위의 예시에서 Membership은 두 개의 외부 키가 Person(person과 inviter)을 가리키기 때문에 관련 관계가 모호하고 Django가 어떤 것을 사용할지 알 수 없다.
이 경우 through 을 사용해야 합니다.fields에서 Django가 사용할 외부 키 지정
through_필드는 2원조 ('field1','field2') 를 수신합니다. 그 중에서 필드 1은 Many Tomany Field 필드를 정의하는 모델의 키 이름 (이 예는 그룹) 을 가리키고 필드 2는 목표 모델을 가리키는 키 이름 (이 예는 person) 입니다.
ManyToManyField.db_table
기본적으로 관련 테이블의 이름은 여러 쌍의 여러 필드의 이름과 이 테이블을 포함하는 모델의 이름,Hash값으로 생성됩니다. 예를 들어 memberShip_person_3c1f5테이블의 이름을 수동으로 지정하려면 db_table 키워드 매개 변수를 사용하여 지정할 수 있습니다.
others
다음 API는 ForeignKey의 동일한 이름의 API와 같습니다.
  • ManyToManyField.db_constraint
  • ManyToManyField.related_name
  • ManyToManyField.related_query_name

  • ManyToManyField를 사용한 질의
    ForeignKey와 유사한 API.
    >>>e = Group.objects.get(id=3)
    >>>e.members.all() # Returns all members objects for this Group.

    질의 반전:
    >>>a = Person.objects.get(id=1)
    >>>a.group_set.all()

    동일 relatedname은 역방향 조회 집합의 이름을 설정할 수 있습니다.
    참조 자료:
    django 문서 - 모델 필드 - 관련 필드
    django 문서 - 질의 실행 - 연관된 객체
    django 문서 - 쿼리 실행 - 상호 연관 관계 쿼리

    좋은 웹페이지 즐겨찾기