[TIL] 관계형 Model (1 대 1,Many Field) 22/11/15 12일차 미완

2022. 11. 17. 02:20스파르타코딩(22.8.29~22.12.31)/TIL(Today I Learned)

- Today I Learned

- 이전에 하나의 DB모델을 만들기 위해 모델의 필드와 그 옵션에 대해 알아봤다.

  이번엔 그 모델과 다른모델과의 관계성을 알아보려고 했는데,

  내용이 많고 복잡해 1개의 모델에 연관성을 주는 Field옵션에 대해 먼저 알아보려고 한다!

Django의 관계형 Field란?

관계형 데이터베이스의 중요 역할 모델들을 서로 엮어 관계를 형성하는 것이다.

관계형 데이터베이스의 대표적인 관계로는

1) 일대일(one-to-one)

2) 다대일(many-to-one)

3) 다대다(many-to-many) 이렇게 세 가지가 있다.

 

처음에는 이게 무슨말인가 싶었는데 일대일? Foreign key인가? 각각의 필드역활인가 했는데

모델의 관계가 어떤식으로 연관이 있는가에 대한 관계뜻하는 의미였다.

 

하나씩 개념을 알아보자

 

* 참조 한다의 의미 더보기↓ (중요)

더보기

PK,FK,참조한다의 의미

 

 


 

 

 - one to one Field (1대 1 관계의 영역)

  한 테이블의 하나의 레코드가 다른 테이블의 단 하나의 레코드만을 참조할 때, 이 두 모델간의 관계를 일대일 관계 라고 한다. 일대일 관계는 어떤 테이블을 구조적으로 확장시킬 때 가장 유용하게 쓰인다.

 

ForeignKey

클래스 ForeignKey ( to , on_delete , ** 옵션 ) 

다대일 관계. 모델이 관련된 클래스와 on_delete옵션이라는 두 가지 위치 인수가 필요합니다.

재귀 관계(자신과 다대일 관계를 갖는 개체)를 만들려면 를 사용 합니다.models.ForeignKey('self', on_delete=models.CASCADE)

아직 정의되지 않은 모델에서 관계를 생성해야 하는 경우 모델 객체 자체가 아닌 모델의 이름을 사용할 수 있습니다.

from django.db import models

class Car(models.Model):
    manufacturer = models.ForeignKey(
        'Manufacturer',
        on_delete=models.CASCADE,
    )
    # ...

class Manufacturer(models.Model):
    # ...
    pass

추상 모델 에서 이 방식으로 정의된 관계 는 모델이 구체적인 모델로 하위 분류되고 추상 모델의 app_label다음 과 관련되지 않을 때 해결됩니다.

products/models.py
from django.db import models

class AbstractCar(models.Model):
    manufacturer = models.ForeignKey('Manufacturer', on_delete=models.CASCADE)

    class Meta:
        abstract = True
production/models.py
from django.db import models
from products.models import AbstractCar

class Manufacturer(models.Model):
    pass

class Car(AbstractCar):
    pass

# Car.manufacturer will point to `production.Manufacturer` here.

다른 애플리케이션에 정의된 모델을 참조하려면 전체 애플리케이션 레이블을 사용하여 모델을 명시적으로 지정할 수 있습니다. 예를 들어 Manufacturer 위의 모델이 라는 다른 응용 프로그램에서 정의된 경우 production다음을 사용해야 합니다.

class Car(models.Model):
    manufacturer = models.ForeignKey(
        'production.Manufacturer',
        on_delete=models.CASCADE,
    )

게으른 관계라고 하는 이러한 종류의 참조는 두 애플리케이션 간의 순환 가져오기 종속성을 해결할 때 유용할 수 있습니다.

에 데이터베이스 인덱스가 자동으로 생성됩니다 ForeignKey. db_index로 설정 하여 비활성화할 수 있습니다 False. 조인이 아닌 일관성을 위해 외래 키를 생성하거나 부분 또는 다중 열 인덱스와 같은 대체 인덱스를 생성하려는 경우 인덱스 오버헤드를 방지할 수 있습니다.

데이터베이스 표현 

배후에서 Django는 "_id"필드 이름에 추가하여 데이터베이스 열 이름을 만듭니다. 위의 예에서 Car 모델의 데이터베이스 테이블에는 manufacturer_id열이 있습니다. (를 지정하여 명시적으로 변경할 수 있습니다 db_column.) 그러나 사용자 지정 SQL을 작성하지 않는 한 코드에서 데이터베이스 열 이름을 처리할 필요가 없습니다. 항상 모델 개체의 필드 이름을 처리합니다.

인수 

ForeignKey관계 작동 방식에 대한 세부 정보를 정의하는 다른 인수를 허용합니다.

ForeignKey.on_delete

a가 참조하는 객체 가 삭제되면 Django는 인수 ForeignKey로 지정된 SQL 제약 조건의 동작을 에뮬레이트합니다 . on_delete예를 들어 nullable이 ForeignKey있고 참조된 객체가 삭제될 때 null로 설정되기를 원하는 경우:

user = models.ForeignKey(
    User,
    models.SET_NULL,
    blank=True,
    null=True,
)

on_delete데이터베이스에 SQL 제약 조건을 생성하지 않습니다. 데이터베이스 수준 캐스케이드 옵션에 대한 지원은 나중에 구현될 수 있습니다 .

가능한 값은 on_delete다음에서 찾을 수 있습니다 django.db.models.

  • CASCADE캐스케이드가 삭제됩니다. Django는 SQL 제약 조건 ON DELETE CASCADE의 동작을 에뮬레이트하고 ForeignKey를 포함하는 개체도 삭제합니다.
  • Model.delete()관련 모델에서는 호출되지 않지만 삭제된 모든 개체에 대해 pre_delete및 신호가 전송됩니다.post_delete
  • PROTECTProtectedError의 하위 클래스인 를 발생시켜 참조된 개체의 삭제를 방지합니다 django.db.IntegrityError.
  • RESTRICTRestrictedError( 의 하위 클래스 ) 를 발생시켜 참조된 개체의 삭제를 방지합니다 django.db.IntegrityError. 과 달리 참조된 객체의 삭제는 동일한 작업에서 관계 PROTECT를 통해 삭제되는 다른 객체도 참조하는 경우 허용됩니다 .CASCADE
    class Artist(models.Model):
        name = models.CharField(max_length=10)
    
    class Album(models.Model):
        artist = models.ForeignKey(Artist, on_delete=models.CASCADE)
    
    class Song(models.Model):
        artist = models.ForeignKey(Artist, on_delete=models.CASCADE)
        album = models.ForeignKey(Album, on_delete=models.RESTRICT)
    
    Artist계단식 관계를 통해 자신을 참조 하기 때문에 Album a 가 참조하는 을 삭제하는 것을 의미하더라도 삭제할 수 있습니다 . 예를 들어:SongSongArtist
  • >>> artist_one = Artist.objects.create(name='artist one')
    >>> artist_two = Artist.objects.create(name='artist two')
    >>> album_one = Album.objects.create(artist=artist_one)
    >>> album_two = Album.objects.create(artist=artist_two)
    >>> song_one = Song.objects.create(artist=artist_one, album=album_one)
    >>> song_two = Song.objects.create(artist=artist_one, album=album_two)
    >>> album_one.delete()
    # Raises RestrictedError.
    >>> artist_two.delete()
    # Raises RestrictedError.
    >>> artist_one.delete()
    (4, {'Song': 2, 'Album': 1, 'Artist': 1})
    
  • 다음 모델 세트를 고려하십시오.
  • SET_NULLForeignKeynull 을 설정하십시오 . 이 경우에만 가능 null합니다 True.
  • SET_DEFAULTForeignKey를 기본값으로 설정합니다 . 에 대한 기본값을 ForeignKey설정해야 합니다.
  • SET() ForeignKey에 전달된 값으로 설정 SET()하거나 콜러블이 전달된 경우 이를 호출한 결과로 설정합니다. 대부분의 경우 models.py가져올 때 쿼리를 실행하지 않으려면 콜러블을 전달해야 합니다.
  • 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),
        )
    
  • DO_NOTHING아무 조치도 취하지 마십시오. 데이터베이스 백엔드가 참조 무결성을 적용하는 경우 데이터베이스 필드 IntegrityError에 SQL 제약 조건을 수동으로 추가하지 않는 한 이로 인해 오류가 발생합니다.ON DELETE
ForeignKey.limit_choices_to

이 필드가 a 또는 admin을 사용하여 렌더링될 때 이 필드에 사용 가능한 선택에 대한 제한을 설정합니다 ModelForm(기본적으로 쿼리 세트의 모든 개체를 선택할 수 있음). 사전, Q객체 또는 사전이나 객체를 반환하는 콜러블 Q을 사용할 수 있습니다.

예를 들어:

staff_member = models.ForeignKey(
    User,
    on_delete=models.CASCADE,
    limit_choices_to={'is_staff': True},
)

ModelForm가 있는 to 목록 의 해당 필드 만 발생 Users 합니다 is_staff=True. 이것은 Django 관리자에게 도움이 될 수 있습니다.

호출 가능한 양식은 예를 들어 Python 모듈과 함께 사용하여 datetime날짜 범위별로 선택을 제한할 때 유용할 수 있습니다. 예를 들어:

def limit_pub_date_choices():
    return {'pub_date__lte': datetime.date.today()}

limit_choices_to = limit_pub_date_choices

복잡한 쿼리 에 유용한 limit_choices_to이거나 반환하는 경우 필드가 모델  나열되지 않은 경우 관리자에서 사용 가능한 선택 사항에만 영향을 미칩니다 .Q objectraw_id_fieldsModelAdmin

메모

콜러블이 에 사용되는 경우 limit_choices_to새 양식이 인스턴스화될 때마다 호출됩니다. 예를 들어 관리 명령이나 관리자에 의해 모델이 검증될 때 호출될 수도 있습니다. 관리자는 다양한 엣지 케이스에서 양식 입력을 여러 번 검증하기 위해 쿼리 세트를 구성하므로 콜러블이 여러 번 호출될 가능성이 있습니다.

ForeignKey.related_name

관련 개체에서 다시 이 개체로의 관계에 사용할 이름입니다. related_query_name(대상 모델에서 역방향 필터 이름으로 사용할 이름) 의 기본값이기도 합니다 . 전체 설명과 예제 는 관련 객체 문서 를 참조하십시오 . 추상 모델 에서 관계를 정의할 때 이 값을 설정해야 합니다 . 그렇게 하면 일부 특수 구문 을 사용할 수 있습니다.

Django가 역방향 관계를 생성하지 않도록 하려면 로 설정 related_name하거나 로 '+' '+'냅니다. 예를 들어, 이것은 User모델이 이 모델과 역방향 관계를 가지지 않도록 합니다:

user = models.ForeignKey(
    User,
    on_delete=models.CASCADE,
    related_name='+',
)
ForeignKey.related_query_name

대상 모델에서 역방향 필터 이름에 사용할 이름입니다. 기본값은 related_name또는 default_related_name설정되어 있는 경우 값이고, 그렇지 않으면 모델 이름이 기본값입니다.

# Declare the ForeignKey with 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)

# That's now the name of the reverse filter
Article.objects.filter(tag__name="important")

마찬가지로 일부 특수 구문 을 통해 앱 레이블 및 클래스 보간을 지원 related_name합니다 .related_query_name

ForeignKey.to_field

관계가 있는 관련 개체의 필드입니다. 기본적으로 Django는 관련 개체의 기본 키를 사용합니다. 다른 필드를 참조하는 경우 해당 필드에 가 있어야 합니다 unique=True.

ForeignKey.db_constraint

이 외래 키에 대한 제약 조건을 데이터베이스에 만들어야 하는지 여부를 제어합니다. 기본값은 True이며 거의 확실하게 원하는 것입니다. 이것을 로 설정하면 False데이터 무결성이 매우 나빠질 수 있습니다. 즉, 이 작업을 수행할 수 있는 몇 가지 시나리오는 다음과 같습니다.

  • 유효하지 않은 기존 데이터가 있습니다.
  • 데이터베이스를 샤딩하고 있습니다.

로 설정하면 False존재하지 않는 관련 객체에 액세스하면 DoesNotExist예외가 발생합니다.

ForeignKey.swappable

ForeignKey 교체 가능한 모델을 가리키는 경우 마이그레이션 프레임워크의 반응을 제어합니다 . True기본값인 경우  ForeignKey현재 값(또는 다른 교환 가능한 모델 설정)과 일치하는 모델을 가리키는 경우 settings.AUTH_USER_MODEL관계는 모델이 아닌 설정에 대한 참조를 사용하여 마이그레이션에 저장됩니다.

False예를 들어 사용자 지정 사용자 모델을 위해 특별히 설계된 프로필 모델인 경우와 같이 모델이 항상 교체된 모델을 가리켜야 한다고 확신하는 경우 에만 이를 재정의할 수 있습니다 .

 False설정해도 교체 가능한 모델을 참조할 수 있다는 의미는 아닙니다. False이 ForeignKey로 만든 마이그레이션은 항상 지정한 정확한 모델을 참조합니다(따라서 사용자가 User 예를 들어 지원하지 않는 모델).

확실하지 않은 경우 기본값인 True.

ManyToManyField

class ManyToManyField ( to , ** options ) 

다대다 관계. 위치 인수가 필요합니다. 모델이 관련된 클래스이며 재귀  게으른 관계 ForeignKey를 포함하여 에서와 정확히 동일하게 작동합니다.

필드의 를 사용하여 관련 개체를 추가, 제거 또는 생성할 수 있습니다 RelatedManager.

데이터베이스 표현 

배후에서 Django는 다대다 관계를 나타내는 중간 조인 테이블을 만듭니다. 기본적으로 이 테이블 이름은 다대다 필드의 이름과 이를 포함하는 모델의 테이블 이름을 사용하여 생성됩니다. 일부 데이터베이스는 특정 길이 이상의 테이블 이름을 지원하지 않기 때문에 이러한 테이블 이름은 자동으로 잘리고 고유성 해시가 사용됩니다(예: author_books_9cdf. 옵션 을 사용하여 조인 테이블의 이름을 수동으로 제공할 수 있습니다 db_table.

인수 

ManyToManyField관계가 작동하는 방식을 제어하는 ​​추가 인수 집합(모두 선택 사항)을 허용합니다.

ManyToManyField.related_name

와 동일합니다 ForeignKey.related_name.

ManyToManyField.related_query_name

와 동일합니다 ForeignKey.related_query_name.

ManyToManyField.limit_choices_to

와 동일합니다 ForeignKey.limit_choices_to.

ManyToManyField.symmetrical

자신의 ManyToManyFields 정의에만 사용됩니다. 다음 모델을 고려하십시오.

from django.db import models

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

Django는 이 모델을 처리할 때 자체적으로 on이 있음을 식별하고 결과적으로 클래스 에 속성을 ManyToManyField추가하지 않습니다 . 대신 대칭적이라고 가정합니다. 즉, 내가 당신의 친구라면 당신도 내 친구입니다.person_setPersonManyToManyField

와의 다대다 관계에서 대칭을 원하지 않으면 로 self설정 symmetrical합니다 False. 이렇게 하면 Django가 반대 관계에 대한 설명자를 추가하여 ManyToManyField관계가 비대칭이 되도록 합니다.

ManyToManyField.through

Django는 다대다 관계를 관리하기 위해 자동으로 테이블을 생성합니다. 그러나 중간 테이블을 수동으로 지정하려는 경우 사용 through하려는 중간 테이블을 나타내는 Django 모델을 지정하는 옵션을 사용할 수 있습니다.

이 옵션의 가장 일반적인 용도는 추가 데이터를 다대다 관계와 연결하려는 경우 입니다.

메모

동일한 인스턴스 간에 여러 연결을 원하지 않는 경우 UniqueConstraintfrom 및 to 필드를 포함하여 추가합니다. Django의 자동 생성 다대다 테이블에는 이러한 제약 조건이 포함되어 있습니다.

메모

중간 모델을 사용하는 재귀 관계는 역접근자 이름이 같기 때문에 역방향 접근자 이름을 결정할 수 없습니다. related_name적어도 하나는 a로 설정해야 합니다. Django에서 역방향 관계를 만들지 않으려면 로 설정 related_name 합니다 '+'.

명시적 모델을 지정하지 않은 경우 에도 연관을 유지하기 위해 생성된 테이블에 직접 액세스하는 데 사용할 수 through있는 암시적 모델 클래스가 여전히 있습니다. through모델을 연결하는 세 개의 필드가 있습니다.

소스 및 대상 모델이 다른 경우 다음 필드가 생성됩니다.

  • id: 관계의 기본 키입니다.
  • <containing_model>_id: id를 선언하는 모델의 ManyToManyField.
  • <other_model>_id: 가 가리키는 id모델의 입니다 .ManyToManyField

동일한 모델에서 포인트를 주고받는 경우 ManyToManyField다음 필드가 생성됩니다.

  • id: 관계의 기본 키입니다.
  • from_<model>_id: id모델을 가리키는 인스턴스(즉, 소스 인스턴스).
  • to_<model>_id: id관계가 가리키는 인스턴스(즉, 대상 모델 인스턴스).

이 클래스는 일반 모델과 같은 주어진 모델 인스턴스에 대한 관련 레코드를 쿼리하는 데 사용할 수 있습니다.

Model.m2mfield.through.objects.all()
ManyToManyField.through_fields

사용자 정의 중간 모델이 지정된 경우에만 사용됩니다. 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, 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)

Membership( 및 )에 대한  개의 외래 키 가 있으므로 관계가 모호해지고 Django는 어느 것을 사용할지 알 수 없습니다. 이 경우 위의 예에서와 같이 Django가 를 사용하여 사용할 외래 키를 명시적으로 지정해야 합니다 .Personpersoninviterthrough_fields

through_fields2-튜플 을 허용합니다. 여기서 는 정의된 모델에 대한 외래 키의 이름 ( 이 경우)과 대상 모델에 대한 외래 키의 이름( 이 경우)입니다.('field1', 'field2')field1ManyToManyFieldgroupfield2person

다대다 관계에 참여하는 모델 중 하나(또는 둘 다)에 대한 중간 모델에 둘 이상의 외래 키가 있는 경우 를 지정 해야 합니다through_fields . 이는 중간 모델이 사용되고 모델에 대한 외래 키가 두 개 이상이거나 Django에서 사용해야 하는 두 개를 명시적으로 지정하려는 경우 재귀 관계 에도 적용됩니다 .

ManyToManyField.db_table

다대다 데이터를 저장하기 위해 생성할 테이블의 이름입니다. 이것이 제공되지 않으면 Django는 관계를 정의하는 모델의 테이블과 필드 자체의 이름을 기반으로 기본 이름을 가정합니다.

ManyToManyField.db_constraint

중간 테이블의 외래 키에 대한 제약 조건을 데이터베이스에 만들어야 하는지 여부를 제어합니다. 기본값은 True이며 거의 확실하게 원하는 것입니다. 이것을 로 설정하면 False데이터 무결성이 매우 나빠질 수 있습니다. 즉, 이 작업을 수행할 수 있는 몇 가지 시나리오는 다음과 같습니다.

  • 유효하지 않은 기존 데이터가 있습니다.
  • 데이터베이스를 샤딩하고 있습니다.

db_constraint 를 모두 전달하는 것은 오류 through입니다.

ManyToManyField.swappable

ManyToManyField 교체 가능한 모델을 가리키는 경우 마이그레이션 프레임워크의 반응을 제어합니다 . True기본값인 경우  ManyToManyField현재 값(또는 다른 교환 가능한 모델 설정)과 일치하는 모델을 가리키는 경우 settings.AUTH_USER_MODEL관계는 모델이 아닌 설정에 대한 참조를 사용하여 마이그레이션에 저장됩니다.

False예를 들어 사용자 지정 사용자 모델을 위해 특별히 설계된 프로필 모델인 경우와 같이 모델이 항상 교체된 모델을 가리켜야 한다고 확신하는 경우 에만 이를 재정의할 수 있습니다 .

확실하지 않은 경우 기본값인 True.

ManyToManyField를 지원하지 않습니다 validators.

null데이터베이스 수준에서 관계를 요구할 방법이 없기 때문에 효과가 없습니다.

OneToOneField

class OneToOneField ( to , on_delete , parent_link = False , ** options ) 

일대일 관계입니다. 개념적으로 이것은 ForeignKeywith 와 유사 unique=True하지만 관계의 "반대" 측은 단일 객체를 직접 반환합니다.

이것은 어떤 식으로든 다른 모델을 "확장"하는 모델의 기본 키로 가장 유용합니다. 다중 테이블 상속 은 예를 들어 자식 모델에서 부모 모델로의 암시적 일대일 관계를 추가하여 구현됩니다.

하나의 위치 인수가 필요합니다: 모델이 관련될 클래스입니다. 이것은 재귀  게으른 관계 ForeignKey에 관한 모든 옵션을 포함하여 에서와 정확히 동일하게 작동합니다 .

related_name에 대한 인수를 지정하지 않으면 OneToOneFieldDjango는 현재 모델의 소문자 이름을 기본값으로 사용합니다.

다음 예에서:

from django.conf import settings
from django.db import models

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

RelatedObjectDoesNotExist관련 테이블에 항목이 없으면 역방향 관계에 액세스할 때 예외가 발생합니다 . 이는 대상 모델 Model.DoesNotExist예외의 하위 클래스이며 역방향 접근자의 특성으로 액세스할 수 있습니다. 예를 들어 사용자에게 다음으로 지정된 감독자가 없는 경우 MySpecialUser:

try:
    user.supervisor_of
except User.supervisor_of.RelatedObjectDoesNotExist:
    pass

또한 에서 OneToOneField허용하는 모든 추가 인수 ForeignKey와 하나의 추가 인수를 허용합니다.

OneToOneField.parent_link

다른 구체적인 모델True 에서 상속되는 모델에서 사용되는 경우 이 필드는 일반적으로 서브클래싱에 의해 암시적으로 생성되는 추가 항목이 아니라 상위 클래스에 대한 링크로 다시 사용되어야 함을 나타냅니다 .OneToOneField

의 사용 예는 일대일 관계 를 참조하십시오 OneToOneField.

필드 API 참조 

클래스 Field 

Field데이터베이스 테이블 열을 나타내는 추상 클래스입니다. Django는 필드를 사용하여 데이터베이스 테이블( db_type())을 생성하고 Python 유형을 데이터베이스에 매핑( get_prep_value())하거나 그 반대로 매핑합니다( from_db_value()).

따라서 필드는 다양한 Django API, 특히 models querysets.

모델에서 필드는 클래스 속성으로 인스턴스화되며 특정 테이블 열을 나타냅니다 . 모델 을 참조하십시오 . null여기에는 및 와 같은 속성과 uniqueDjango가 필드 값을 데이터베이스별 값에 매핑하는 데 사용하는 메서드가 있습니다.

A Field는 의 하위 클래스 RegisterLookupMixin이므로 s Transform에서 Lookup사용하도록 등록할 수 있습니다 QuerySet(예: field_name__exact="foo"). 모든 기본 제공 조회 는 기본적으로 등록됩니다.

와 같은 Django의 모든 내장 필드 CharField는 의 특정 구현입니다 Field. 사용자 지정 필드가 필요한 경우 기본 제공 필드의 하위 클래스를 만들거나 Field처음부터 작성할 수 있습니다. 두 경우 모두 사용자 정의 모델 필드를 만드는 방법을 참조하십시오 .

description

응용 프로그램 과 같은 필드에 대한 자세한 설명입니다 django.contrib.admindocs.

설명은 다음 형식일 수 있습니다.

description = _("String (up to %(max_length)s)")

여기서 인수는 필드의 __dict__.

descriptor_class

인스턴스화되고 모델 인스턴스 속성에 할당되는 디스크립터 프로토콜 을 구현하는 클래스 입니다. Field생성자는 인스턴스 라는 단일 인수를 수락해야 합니다 . 이 클래스 특성을 재정의하면 가져오기 및 설정 동작을 사용자 지정할 수 있습니다.

Django는 a를 데이터베이스 특정 유형에 매핑하기 Field위해 다음과 같은 여러 메서드를 노출합니다.

get_internal_type() 

백엔드 특정 목적을 위해 이 필드의 이름을 지정하는 문자열을 반환합니다. 기본적으로 클래스 이름을 반환합니다.

사용자 정의 필드에서 사용할 내장 필드 유형 에뮬레이션을 참조하십시오 .

db_type( 연결 ) 

Field를 고려하여 에 대한 데이터베이스 열 데이터 유형을 반환합니다 connection.

사용자 정의 필드에서 사용하기 위한 사용자 정의 데이터베이스 유형 을 참조하십시오 .

rel_db_type( 연결 ) 

를 고려하여 ForeignKey  OneToOneField을 가리키는 필드에 대한 데이터베이스 열 데이터 유형을 반환합니다 .Fieldconnection

사용자 정의 필드에서 사용하기 위한 사용자 정의 데이터베이스 유형 을 참조하십시오 .

Django가 데이터베이스 백엔드 및 필드와 상호 작용해야 하는 세 가지 주요 상황이 있습니다.

  • 데이터베이스를 쿼리할 때(Python 값 -> 데이터베이스 백엔드 값)
  • 데이터베이스에서 데이터를 로드할 때(데이터베이스 백엔드 값 -> Python 값)
  • 데이터베이스에 저장할 때(Python 값 -> 데이터베이스 백엔드 값)

쿼리할 때 get_db_prep_value() get_prep_value()사용:

get_prep_value(  ) 

value모델 속성의 현재 값이며 메서드는 쿼리에서 매개 변수로 사용하기 위해 준비된 형식으로 데이터를 반환해야 합니다.

사용법은 Python 개체를 쿼리 값으로 변환을 참조하세요 .

get_db_prep_value(  , 연결 , 준비 됨 = False ) 

value백엔드별 값으로 변환 합니다. 기본적으로 valueif prepared=True get_prep_value()if is 를 반환합니다 False.

사용을 위해 조회 값을 데이터베이스 값으로 변환을 참조하십시오 .

데이터를 로드할 때 from_db_value()다음이 사용됩니다.

from_db_value(  , 표현식 , 연결 ) 

데이터베이스에서 반환된 값을 Python 개체로 변환합니다. 의 반대입니다 get_prep_value().

이 방법은 데이터베이스 백엔드가 이미 올바른 Python 유형을 반환하거나 백엔드 자체가 변환을 수행하므로 대부분의 내장 필드에는 사용되지 않습니다.

expression와 동일합니다 self.

사용을 위해 값을 Python 객체로 변환을 참조하세요 .

메모

성능상의 이유로 from_db_value필요하지 않은 필드(모든 Django 필드)에서는 no-op로 구현되지 않습니다. 결과적으로 super정의를 호출할 수 없습니다.

저장할 때 pre_save() get_db_prep_save()사용:

get_db_prep_save(  , 연결 ) 

와 동일 get_db_prep_value()하지만 필드 값 을 데이터베이스에 저장 해야 할 때 호출됩니다. 기본적으로 를 반환합니다 get_db_prep_value().

pre_save( model_instance , 추가 ) 

저장되기 전에 값을 준비하기 위해 이전에 호출된 메서드 get_db_prep_save()(예: for DateField.auto_now).

model_instance이 필드가 속한 add 인스턴스이며 인스턴스가 처음으로 데이터베이스에 저장되는지 여부입니다.

model_instance이 필드에 대해 적절한 속성 값을 반환해야 합니다. 속성 이름은 에 있습니다 self.attname( 에 의해 설정됨 Field).

사용을 위해 저장하기 전에 값 전처리를 참조하세요 .

필드는 종종 직렬화 또는 양식에서 다른 유형으로 값을 수신합니다.

to_python(  ) 

값을 올바른 Python 객체로 변환합니다. 의 반대 역할을 value_to_string()하며 in 이라고도 clean()합니다.

사용을 위해 값을 Python 객체로 변환을 참조하세요 .

데이터베이스에 저장하는 것 외에도 필드는 값을 직렬화하는 방법도 알아야 합니다.

value_from_object( 객체 ) 

주어진 모델 인스턴스에 대한 필드 값을 반환합니다.

이 방법은 에서 자주 사용합니다 value_to_string().

value_to_string( 객체 ) 

obj문자열로 변환 합니다. 필드 값을 직렬화하는 데 사용됩니다.

사용법 은 직렬화를 위한 필드 데이터 변환을 참조하십시오 .

를 사용할 때 다음과 같이 표시되어야 하는 양식 필드를 알아야 합니다.model formsField

formfield( form_class = 없음 , choice_form_class = 없음 , ** kwargs ) 

django.forms.Field에 대한 이 필드 의 기본값을 반환합니다 ModelForm.

기본적으로 form_class choices_form_class가 모두 인 경우 None를 사용합니다 CharField. 필드가 choices있고 choices_form_class 지정되지 않은 경우 를 사용합니다 TypedChoiceField.

사용 을 위해 모델 필드에 대한 양식 필드 지정을 참조하십시오 .

deconstruct() 

필드를 재생성하기에 충분한 정보가 포함된 4-튜플을 반환합니다.

  1. 모델의 필드 이름입니다.
  2. 필드의 가져오기 경로(예: "django.db.models.IntegerField"). 이것은 가장 휴대하기 쉬운 버전이어야 하므로 덜 구체적일 수도 있습니다.
  3. 위치 인수 목록입니다.
  4. 키워드 인수의 사전입니다.

마이그레이션을 사용하여 데이터를 마이그레이션 하려면 이 방법을 1.7 이전의 필드에 추가해야 합니다 .

조회 등록 및 가져오기 

Field조회 등록 API를 구현합니다 . API를 사용하여 필드 클래스에 사용할 수 있는 조회와 필드에서 조회를 가져오는 방법을 사용자 정의할 수 있습니다.

필드 속성 참조 

모든 Field인스턴스에는 해당 동작을 검사할 수 있는 여러 특성이 포함되어 있습니다. isinstance 필드의 기능에 의존하는 코드를 작성해야 하는 경우 검사 대신 이러한 속성을 사용하십시오 . 이러한 속성은 Model._meta API 와 함께 사용하여 특정 필드 유형에 대한 검색 범위를 좁힐 수 있습니다. 사용자 정의 모델 필드는 이러한 플래그를 구현해야 합니다.

필드 속성 

Field.auto_created

OneToOneField모델 상속 에서 사용되는 것과 같이 필드가 자동으로 생성되었는지 여부를 나타내는 부울 플래그입니다 .

Field.concrete

필드에 연결된 데이터베이스 열이 있는지 여부를 나타내는 부울 플래그입니다.

Field.hidden

필드가 숨겨지지 않은 다른 필드의 기능을 지원하는 데 사용되는지 여부를 나타내는 부울 플래그(예: 를 구성하는 content_type object_id필드 GenericForeignKey). hidden플래그는 모델에 있는 모든 필드에서 모델에 있는 필드의 공용 하위 집합을 구성하는 항목을 구별하는 데 사용됩니다 .

메모

Options.get_fields() 기본적으로 숨겨진 필드를 제외합니다. include_hidden=True결과에 숨겨진 필드를 반환하려면 전달하십시오 .

Field.is_relation

ForeignKey필드가 해당 기능(예: , ManyToManyField, OneToOneField등) 에 대한 하나 이상의 다른 모델에 대한 참조를 포함하는지 여부를 나타내는 부울 플래그입니다 .

Field.model

필드가 정의된 모델을 반환합니다. 필드가 모델의 슈퍼클래스에 정의된 경우 model인스턴스의 클래스가 아닌 슈퍼클래스를 참조합니다.

관계가 있는 필드의 속성 

이러한 특성은 관계의 카디널리티 및 기타 세부 정보를 쿼리하는 데 사용됩니다. 이러한 속성은 모든 필드에 있습니다. None그러나 필드가 관계 유형( )인 경우 에는 부울 값만 갖습니다 Field.is_relation=True.

Field.many_to_many

True필드에 다대다 관계가 있는 경우의 부울 플래그입니다 . False그렇지 않으면. Django에 포함된 유일한 필드는 True입니다 ManyToManyField.

Field.many_to_one

True필드에 a와 같은 다대일 관계가 있는 경우 부울 플래그입니다 ForeignKey. False그렇지 않으면.

Field.one_to_many

True필드가 일대다 관계(예: a GenericRelation또는 a 의 반대)인 경우 부울 플래그입니다 ForeignKey. False 그렇지 않으면.

Field.one_to_one

True필드가 일대일 관계인 경우 부울 플래그 (예: OneToOneField; False그렇지 않으면.

Field.related_model

필드와 관련된 모델을 가리킵니다. 예를 Author들어 . for a  항상 입니다.ForeignKey(Author, on_delete=models.CASCADE)related_modelGenericForeignKeyNone

반응형