Django Model 다중 테이블 쿼리
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_name
는 ForeignKey.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를 사용한 질의
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 문서 - 쿼리 실행 - 상호 연관 관계 쿼리
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.