Django 관계 유형 필드
본문은 모두 세 종류로 나뉘는데, 각각
외부 키ForeignKey
class ForeignKey(to, on_delete, **options)
to
: 관련 모델 on_delete
: 연결 제거(2.0 이후 필수) from django.db import models
# app ,
# CreateCar appone , appone.CreateCar
class Car(models.Model):
create_car = models.ForeignKey(
'CreateCar', # here
on_delete=models.CASCADE,
)
class CreateCar(models.Model):
pass
자체 귀속
# self ( )
class Comment(models.Model):
title = models.CharField(max_length=128)
text = models.TextField()
parent_comment = models.ForeignKey('self', on_delete=models.CASCADE)
실제 데이터베이스 백그라운드에서 Django는 모든 외부 키에id 접미사를 만들고 데이터 테이블의 열을 만듭니다.
중요 매개 변수
이 칸을 단독으로 열거해야 하는 이유는 관계 유형의 필드에서 대부분이 같기 때문이다. 이 칸은 주로 키 파라미터이고 다른 다대다와 일대일 중에는 같은 파라미터가 많기 때문에 후속 두 칸에서 이 참수 그룹과 다른 부분만 열거한다.
on_delete
Django는 외부 키 연관 객체가 삭제되면
on_delete
의 제약을 따릅니다."""
, null
on_delete=models.CASCADE
"""
user = models.ForeignKey(
User,
models.SET_NULL,
blank=True,
null=True,
)
이 매개 변수의 상수는
django.db.models.deletion.py
에서 모든 상수를 볼 수 있다CASCADE
: 아날로그 SQL 언어의 ON DELETE CASCADE
제약, 외부 키가 정의된 모델 대상을 동시에 삭제합니다!(기본값 및 일반) PROTECT
: 삭제 작업을 막고 삭제 시 ProtectedError
이상 SET_NULL
: 외키 필드를 null
으로 설정하고 필드가 null=True
으로 설정된 경우에만 이 값을 사용할 수 있습니다.SET_DEFAULT
: 키 필드를 기본값으로 설정합니다.필드에 default
매개 변수를 설정한 경우에만 사용할 수 있습니다.DO_NOTHING
: 아무것도 안 한다 SET()
: SET()
에 전달되는 값이나 리셋 함수의 리셋 값으로 설정합니다.from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import models
def get_sentinel_user():
return get_user_model().objects.get_or_create(username='deleted')[0]
class MyModel(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.SET(get_sentinel_user),
)
limit_choices_to
이 매개 변수는 외부 키가 연결될 수 있는 대상을 제한하는 데 사용되며,
Django
의 ModelForm
(표 모듈)과 admin
백엔드에만 사용되며, 다른 장소에는 제한 기능이 없다.그 값은
dict
, Q
대상(Q 및 F 참조) 또는 dict
또는 Q()
으로 되돌아오는 함수 호출일 수 있다. 다음과 같다.# employee is_employee=True Users
# admin 。
employee = models.ForeignKey(
User,
on_delete=models.CASCADE,
limit_choices_to={'is_employee': True},
)
related_name
연관된 객체의 역참조 모델 이름입니다.기본값은
None
Car와 Createcar의 예로 설명하면 Createcar에서 Car와 연결된 관계의 이름을 반대로 바꾸는 것이다.이 매개변수는 설정하지 않아도 됩니다. 일반적으로 Django는 기본적으로 모델의 소문자를 역연관 이름으로 사용합니다.
만약 외부 키에 역방향 관련 이름을 설정하고 싶지 않다면, 이 파라미터를
+
으로 끝낼 수 있습니다user = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='+',
)
related_query_name
연관된 질의를 대칭 이동합니다.
대상 모델에서 필터 모델 객체의 이름을 대칭 이동하는 데 사용됩니다.
class Tag(models.Model):
article = models.ForeignKey(
Article,
on_delete=models.CASCADE,
related_name="tags",
related_query_name="tag",
)
name = models.CharField(max_length=255)
# ‘tag’
Article.objects.filter(tag_name="important")
to_field
기본적으로 외부 키는 연결된 대상에 연결된 메인 키입니다.
to_field
매개 변수를 지정하면 지정한 필드에 연결할 수 있지만 이 필드는 유일해야 합니다(unique=True
속성)db_constraint
데이터베이스 제약 조건에 따라 기본값은
True
False
으로 설정하면 데이터의 무결성과 합법성을 보장할 수 없습니다.특수한 경우에만
False
으로 설정해야 합니다.False
이고 존재하지 않는 관계 대상을 방문하려고 시도할 때 DoesNotExist
이상이 발생합니다.여러 쌍의 ManyToManyField
다대다관계는 데이터베이스에서도 매우 흔히 볼 수 있는 관계 유형이다.
예를 들어 한 권의 책에는 여러 명의 작가가 있을 수 있고, 한 명의 작가도 몇 권의 책을 쓸 수 있다.
다대다의 필드는 어느 쪽에서든 정의할 수 있습니다. 사람들의 사고 습관에 부합되는 쪽에 최대한 정의하지만 동시에 정의하지 마세요.
다중 쌍 다중 관계식에는 연관된 객체 모델에 사용할 위치 매개변수가 필요합니다.그것의 용법과 외키는 차이가 많지 않다
class ManyToManyField(to, **options)
데이터베이스 백그라운드에서 Django는 실제적으로 다대다관계를 나타내는 중간표를 추가로 만들 것이다.
+ + hashCode
입니다. 예를 들어 author_books_9cdf4
10db_table
옵션을 사용하여 테이블 이름을 사용자 정의할 수 있습니다.다중 쌍 다중 매개변수 설명
외부 키 매개변수 부분을 참조합니다.
related_name
related_query_name
db_constraint
특별 설명
ManyToManyField
은 Django에 내장된 validators 검증 기능을 지원하지 않습니다.null
매개 변수는 ManyToManyField
에 무효입니다!null=True
을 설정하면 의미가 없습니다. swappable
현재 외부 키가 교환 가능한 모델을 가리키면 이동 프레임워크의 동작을 제어할 수 있습니다.기본값은 True
이며 limit_choices_to
은 through
매개 변수를 사용하여 중간표를 사용자 정의하는 다중 필드에 무효이며, 기타 참조 키 매개 변수 기본적으로 Django의 다대다 관계는 대칭적이며 이 매개 변수의 이름에서'대칭'을 뜻하는 것을 알 수 있다.
from django.db import models
class Person(models.Model):
friends = models.ManyToManyField("self")
Django는 만약에 내가 너의 친구라면 너도 나의 친구라고 생각한다. 이것은 일종의 대칭 관계이다
Django는 Person 모델에
person_set
속성을 추가하여 연관을 대칭 이동할 수 없습니다.이러한 대칭 관계를 사용하지 않으려면 symmetrical
을 False
으로 설정하십시오.through
중간표를 정의하고 특히 설명 중의
limit_choices_to
파라미터를 정의한다. 이것을 제외하고 다른 것은 모두 키 파라미터를 참조하면 through
파라미터는 다대다 특유의 것이고 다대다 관계에서 매우 중요하다는 것을 설명한다.다중 관계에 추가된 관련 테이블을 사용자 정의하려면 이 인자를 사용하십시오!매개변수 값은 중간 모델입니다.
#
id ... id ... id
#
id ... id ... id ...
demo
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'), #
)
#
# Person Group
# ‘ ’ ‘ ’ 。
class Membership(models.Model):
group = models.ForeignKey(Group, on_delete=models.CASCADE)
person = models.ForeignKey(Person, on_delete=models.CASCADE)
inviter = models.ForeignKey( #
Person,
on_delete=models.CASCADE,
related_name="membership_invites",
)
#
invite_reason = models.CharField(max_length=64)
through_fields
Membership
모델에는 Person
과 관련된 두 개의 외부 키가 포함되어 있어 Django는 그룹과 관련된 대상으로 무엇을 사용하는지 확정할 수 없습니다.따라서 이 예에서 관계를 정의하는 데 사용할 through_fields
매개 변수를 명시적으로 지정해야 한다.through_fields
매개 변수는 모듈 ('field1', 'field2')
을 수신합니다field1
: 다중 관계를 정의하는 모델의 외키 필드를 가리키는 이름입니다. 여기는 Membership
중의 group
필드, field2
은 목표 모델의 외키 필드를 가리키는데 여기는 Membership
의 person
이지 inviter
이 아니다.다시 통속적으로 말하면
through_fields
매개 변수는 중간 표 모델 Membership
에서 어느 두 필드를 선택하여 관계 연결 필드로 하는지를 지정한다.db_table
중간 테이블의 이름을 설정합니다.지정하지 않으면 기본값을 사용합니다.
일대일 One ToOne Field
class OneToOneField(to, on_delete, parent_link=False, **options)[source]
개념적으로 보면 일대일 관계는
unique=True
속성을 가진 외키 관계와 매우 유사하지만 역방향 관련 대상은 하나뿐이다.이런 관계 유형은 대부분 하나의 모델이 다른 모델에서 확장되어야 하는 상황에 사용된다.예를 들어 Django가 auth 모듈을 가지고 있는 User 사용자 테이블은 자신의 프로젝트에서 사용자 모델을 만들고 싶고 Django의 인증 기능을 편리하게 사용하고 싶다면 가장 좋은 방안은 사용자 모델에 일대일 관계를 사용하고auth 모듈 User 모델과 관련된 필드를 추가하는 것이다.
이 관계의
to
매개 변수는 관련 모델로 그 사용법은 앞의 다대일 키와 같다.만약 일대일 관계에
related_name
파라미터를 설정하지 않았다면, Django는 현재 모델의 소문자를 기본값으로 사용할 것입니다.OneToOneField
일대일 관계는 다대일 키 관계와 같은 추가 선택 가능한 매개 변수를 가지고 있지만 parent_link
매개 변수가 하나 더 있을 뿐이다.from django.conf import settings
from django.db import models
# Django auth User
class MySpecialUser(models.Model):
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
)
supervisor = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='supervisor_of',
)
이렇게 하면 User 모형은 아래의 속성을 가지게 됩니다
>>> user = User.objects.get(pk=1)
>>> hasattr(user, 'myspecialuser')
True
>>> hasattr(user, 'supervisor_of')
True
모듈 간 모형
크로스 모듈의 모형에 대해 가져오면 사용할 수 있다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.