> 백엔드 개발 > 파이썬 튜토리얼 > Django 문서 - 모델 내

Django 문서 - 모델 내

黄舟
풀어 주다: 2016-12-17 16:05:48
원래의
1033명이 탐색했습니다.

관계 필드

ForeignKey, ManyToManyField 및 OneToOneField는 각각 모델에서 다대일, 다대다 및 일대일 관계를 정의합니다.

예를 들어 출판사에서 책을 출판하고, 출판사에서는 여러 권의 책을 출판할 수 있습니다. 한 권의 책은 여러 작가가 집필하고, 한 작가가 여러 권의 책을 쓸 수 있습니다.

클래스 작성자(models.Model):
name=models.CharField(max_length=20)
클래스 게시자(models.Model):
name=models.CharField(max_length=20) )
class Book(models.Model):
name=models.CharField(max_length=20)
pub=models.ForeignKey(출판사)
Authors=models.ManyToManyField(저자)

1. 정의되지 않은 모델과 연결

정의되지 않은 모델과 연결하려면 모델 개체 자체가 아닌 모델 이름을 사용하세요.

예제에서 Book 뒤에 Publisher와 Author가 정의된 경우

class Book(models.Model):
name=models 형식으로 작성해야 합니다. CharField(max_length=20 )
pub=models.ForeignKey('Publisher')
Authors=models.ManyToManyField('Author')

2.모델이 자신을 연결합니다

모델은 다대일 관계 소유

class People(models.Model):
name=models.CharField(max_length=20)
Leader=models.ForeignKey와 연관될 수 있습니다. ('self',blank=True, null=True)

모델은 자신과 다대다 관계를 가질 수도 있습니다

class Person(models.Model):
friends = models.ManyToManyField("self")

기본적으로 이 연관은 대칭입니다. Person1이 Person2의 친구이면 Person2도 Person1의 친구입니다

p1=사람()
p1.save()
p2=사람()
p2.save()
p3=사람()
p3.save()
p1 .friends.add(p2,p3)

위의 경우 p3의 친구를 찾고 싶다면 p3.person_set.all()은 필요 없고 그냥 p3.friends만 사용하면 된다. .all()

이 대칭 관계를 취소하려면 대칭을 False로 설정하세요

class Person2(models.Model):
friends=(models.ManyToManyField("self" ,symmetrical=False)

이 방법으로 p3의 친구를 쿼리하려면 p3.person_set.all()이 필요합니다.

3. 이름 역명 관련_이름

역명, 관련 필드에서 관련 필드를 가리키는 데 사용됩니다.

추상 모델을 정의할 때 주의하세요. , 역방향 이름을 명시적으로 지정해야 하며, 이를 수행한 후에만 일부 특수 구문이 제대로 작동합니다.

클래스 도서(models.Model):

name=models.CharField(max_length=20)
pub=models.ForeignKey(Publisher,관련_name='pub')
저자=모델 .ManyToManyField(Author, 관련_name='author')

이런 방식으로 Publisher 또는 Author를 사용하여 Book:Publisher1.pub.all() 또는author1.author를 역으로 쿼리할 때 관련_이름을 사용할 수 있습니다. 모두() .

역관계 설정을 원하지 않는 경우, 관련_이름을 '+'로 설정하거나 '+'로 끝나도록 설정하세요.

user = models.ForeignKey(User, 관련_name='+')


동일한 모델을 가리키는 ManyToManyField가 여러 개 있는 경우 FOO_set를 역방향으로 쿼리하면 명확하지 않습니다. 어떤 ManyToManyField 필드가 금지될 수 있습니까?

users = models.ManyToManyField(User, 관련_name='u+')

referents = models.ManyToManyField(User, 관련_name='ref+')

4. 데이터베이스 재현

다대일: Django는 데이터베이스의 열 이름으로 ForeignKey 필드 이름 + "_id"를 사용합니다. 위의 예에서 BOOK 모델에 해당하는 데이터 테이블에Publisher_id 열이 있습니다.

db_column을 명시적으로 지정하여 이 필드의 열 이름을 변경할 수 있습니다. 그러나 SQL을 사용자 정의하려는 경우가 아니면 데이터베이스의 열 이름을 변경할 필요가 없습니다.

다대다: Django ManyToManyField 관계를 나타내는 중간 테이블을 만듭니다. 기본적으로 중간 테이블의 이름은 두 관계형 테이블 이름의 조합입니다.

일부 데이터베이스에서는 테이블 이름 길이에 제한이 있으므로 중간 테이블 이름은 자동으로 64자로 제한되며 고유한 해시 문자열을 포함합니다. 이

은 book_authors_9cdf4와 같은 테이블 이름이 표시될 수 있음을 의미합니다. db_table 옵션을 사용하여 중간 테이블 이름을 수동으로 지정할 수 있습니다.

그러나 중간 테이블을 수동으로 지정하려는 경우 through 옵션을 사용하여 모델을 지정하고 다른 모델을 사용하여 다대다 관계를 관리할 수 있습니다. 그리고 이 모델은 중간 테이블에 해당하는 모델입니다:

class Person(models.Model):

name = models.CharField(max_length=128)

def __unicode__(self ):

self.name 반환
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')
def __unicode__(self):
self.name을 반환

클래스 그룹(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')
def __unicode__(self):
self.name 반환
class Membership(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
date_joined = models.DateField()
Invitation_reason = models.CharField(max_length=64)

이렇게 하면 특정 사람이 그룹에 참여할 때 녹화할 수 있습니다.

Person과 Group 간의 관계를 설정하려면 추가, 생성, 제거 기능을 사용할 수 없으며 Membership을 사용해야 합니다.

>>> ringo = Person.objects.create(name="Ringo Starr")
>>> paul = Person.objects.create(name="Paul McCartney" )
>>> beatles = Group.objects.create(name="The Beatles")
>>> m1 = 멤버십(person=ringo, group=beatles,
. .. date_joined=date(1962, 8, 16),
... Invitation_reason= "새로운 드러머가 필요합니다.")
>>> m1.save()

clear()는 계속 사용할 수 있습니다

>>> beatles.members.clear()

다대다 관계가 자신과 연관되어 있는 경우, 중간 테이블의 ForeignKey 동일한 모델을 가리킬 수 있지만 대칭이 아닌 ManyToManyField의 양쪽으로 간주되어야 하며 대칭=False로 설정되어야 합니다.

5. 기타 매개변수(인수)

5.1 ForeignKey는 관계 작동 방식을 정의하는 다음과 같은 선택적 매개변수를 허용합니다.

ForeignKey.limit_choices_to

Django 관리 백그라운드에서 관련 개체를 필터링하는 데 사용되는 필터 조건과 해당 값이 포함된 사전입니다. 예를 들어 Python의 날짜/시간을 사용하면 모듈, 필터 조건을 충족하지 않는 관련 객체 필터링:

limit_choices_to = {'pub_date__lte': datetime.date.today}

현재 날짜 이전의 pub_date와 연관된 객체만 허용됩니다. 선택됩니다.

Q를 사용할 수도 있습니다. 사전 대신 개체를 사용하여 더 복잡한 필터링이 가능합니다. Limit_choices_to가 Q 객체인 경우 외래 키 필드가 ModelAdmin의 raw_id_fields에 배치되면 사용할 수 없습니다.

ForeignKey.to_field

현재 관계가 연결된 관련 개체의 필드를 지정합니다. 기본적으로 to_field는 관련 개체의 기본 키를 가리킵니다.

ForeignKey.on_delete

모델 객체의 ForeignKey와 연결된 객체가 삭제되면 기본적으로 이 객체도 계단식으로 삭제됩니다.

user = models.ForeignKey(User, 공백=True, null=True, on_delete=models.CASCADE)

CASCADE: 기본값, 모델 객체는 ForeignKey 객체 삭제됨

SET_NULL: 모델 객체의 ForeignKey 필드를 null로 설정합니다. 물론 null을 True로 설정해야 합니다.

SET_DEFAULT: 모델 객체의 ForeignKey 필드를 기본값으로 설정합니다.

보호: ForeignKey 관련 개체

를 삭제하면 ProtectedError가 발생하여 ForeignKey 관련 개체가 삭제되지 않습니다.

SET(): 모델 객체의 ForeignKey 필드를 SET()에 전달된 값으로 설정합니다.

def get_sentinel_user():
return User.objects.get_or_create(username='deleted')[0]

class MyModel(models.Model):
user = models .ForeignKey(User, on_delete=models.SET(get_sentinel_user))

DO_NOTHING: 아무것도 하지 않습니다.

5.2 ManyToManyField는 관계 작동 방식을 정의하는 다음과 같은 선택적 매개변수를 허용합니다.

ManyToManyField.limit_choices_to

는 ForeignKey.limit_choices_to와 사용법이 동일합니다.

limit_choices_to는 through 매개변수를 통해 지정된 중간 테이블이 있는 ManyToManyFields에 대해 작동하지 않습니다.

ManyToManyField.symmetrical

재귀적 다대다 관계를 정의할 때만 작동합니다.

ManyToManyField.through

중간 테이블 수동 지정

ManyToManyField.db_table

다대를 저장하는 데이터베이스의 테이블 이름 지정 -많은 관계 데이터. 이 옵션이 제공되지 않으면 Django는 두 관계형 테이블의 이름을 기반으로 중간 테이블의 이름으로 새 테이블 이름을 생성합니다.

6.OneToOneField

class OneToOneField(othermodel[, parent_link=False, **options])

는 일대일 관계를 정의하는 데 사용됩니다. 광범위하게 말하면 고유=True라고 선언하는 ForeignKey와 동일합니다. 매우 유사하지만 차이점은 역방향 연관을 사용할 때 개체 목록이 아니라 단일 개체를 얻는다는 것입니다.

이 필드는 모델이 다른 모델에서 확장될 때 매우 유용합니다. 예를 들어 다중 테이블 상속(Multi-tableinheritance)이 하위에 전달됩니다. 이는 상위 모델을 가리키는 모델에 일대일 연관을 추가함으로써 달성됩니다.

이 필드에는 관련 모델 클래스라는 매개변수가 제공되어야 합니다. 재귀적 및 게으른 연결을 포함하여 ForeignKey와 동일하게 작동합니다. 더 같은.

또한 OneToOneField는 ForeignKey가 허용하는 매개변수를 허용하며 그 중 OnetoOneField만 허용됩니다. 독점: OneToOneField.parent_link

True이고 상위 모델에서 상속된 하위 모델에 대해 작동하는 경우(이는 상속이 지연될 수 없으며 상위 모델은 실제로 존재해야 함) 필드는 상위 클래스를 확장하고 다른 OneToOneField와 같은 상위 클래스 속성을 상속하는 데 사용되는 대신 상위 클래스 인스턴스

를 가리키는 참조(또는 링크)가 됩니다.

django.db에서 import models, transaction, IntegrityError

class Place(models.Model):
이름 = models.CharField(max_length=50)
주소 = 모델. CharField(max_length=80)

def __unicode__(self):
return u"%s the place" % self.name

class Restaurant(models.Model):
place = models.OneToOneField(Place, Primary_key=True)
presents_hot_dogs = models.BooleanField()
presents_pizza = models.BooleanField()

def __unicode__(self):
return u" %s 레스토랑" % self.place.name

class Waiter(models.Model):
레스토랑 = models.ForeignKey(Restaurant)
name = models.CharField(max_length=50)

def __unicode__(self):
return u"%s the waiter at %s" % (self.name, self.restaurant)

역방향 사용 연관된 경우, 얻는 것은 객체 목록이 아니라 단일 객체입니다:

>>> p1 = Place(name='Demon Dogs', address='944 W. Fullerton')
>>> p1.save()
>>> r = Restaurant(place=p1, presents_hot_dogs=True, presents_pizza=False)
>>> ()
>>> p1.restaurant
<레스토랑: Demon Dogs 레스토랑>
>>> Place.objects.get(restaurant__place__name__startswith="Demon")

>>> Waiter.objects.filter(restaurant__place__name__startswith="Demon")

위는 Django 문서입니다 - 모델 콘텐츠 부탁드립니다. 더 많은 관련 기사를 보려면 PHP 중국어 웹사이트(www.php.cn)를 주목하세요!


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿