다중 테이블 조회https://www.cnblogs.com/Finley/p/5537753.html

5023 단어
다중 테이블 조회는 모델 층의 중요한 기능 중 하나로 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 모델의ForeignKey 필드의 주요 기능은 관련 조회를 위해 일대다 관계를 유지하는 것입니다.
db 에서만constraint=True일 때 Django 모델은 데이터베이스에 키 제약을 만들 수 있으며 이 값이false일 때 제약을 만들지 않습니다.
기본dbconstraint=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_테이블 기본적으로 관련 테이블의 이름은 여러 쌍의 다중 필드 이름과 이 테이블을 포함하는 모델의 이름과Hash값으로 생성됩니다. 예를 들어memberShipperson_3c1f5
테이블의 이름을 수동으로 지정하려면dbtable 키워드 매개 변수 지정.
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은 역방향 조회 집합의 이름을 설정할 수 있습니다.
연결 삭제 추가는 Many ToMany Field가 자동으로 연결 테이블을 유지하기 때문에 프로그래머가 직접 접근하기 불편합니다. Many ToMany Field는 연결을 추가하고 삭제하는 데 사용할 API를 제공합니다. (즉through 테이블의 기록)
through 테이블 자동 유지 관리 모델을 예로 사용합니다.
class User(models.Model): user_id = models.IntegerField(primary_key=True)
class Flight(models.Model): flight_id = models.IntegerField(primary_key=True) reserve = models.ManyToManyField(User, related_name='flight_reserve')
먼저 연관시킬 Flight 및 User 인스턴스를 가져옵니다.
flights = Flight.objects.filter(flight_id=flight_id) if flights.count() != 0: flight = flights[0] users = User.objects.filter(id=user_id) if users.count() != 0: user = users[0] 연결 필드가 있는 Flight 인스턴스를 통해 연결 작업을 추가합니다.
flight.reserve.add(user) flight.save() 삭제 작업은 다음과 같습니다.
flight.reserve.remove(user) flight.save()

좋은 웹페이지 즐겨찾기