관계 필드
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')
referents = models.ManyToManyField(User, 관련_name='ref+')
name = models.CharField(max_length=128)
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)를 주목하세요!