콘텐츠로 이동

열의 하위 집합 선택

모델에서 선택한 열만 선택하려면 다음 함수를 사용할 수 있습니다.

  • fields(columns: Union[List, str, set, dict]) -> QuerySet

  • exclude_fields(columns: Union[List, str, set, dict]) -> QuerySet

  • 쿼리 세트 에이전트

    • QuerysetProxy.fields(columns: Union[List, str, set, dict]) 방법
    • QuerysetProxy.exclude_fields(columns: Union[List, str, set, dict]) 방법

필드

fields(columns: Union[List, str, set, dict]) -> QuerySet

필드()를 사용하여 모델 열의 하위 집합을 선택하여 데이터 로드를 제한할 수 있습니다.

필드()와 _field()를 제외한 필드()는 마스터 모델(get, all 등과 같은 일반 쿼리에서)과 선택 _lated 및 프리페치 _lated 모델(중첩 표기법 사용)에 모두 적용됩니다.

다음 예제 데이터가 제공됩니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import asyncio

import databases
import ormar
import sqlalchemy
from examples import create_drop_database
from tests.settings import DATABASE_URL

base_ormar_config = ormar.OrmarConfig(
    database=databases.Database(DATABASE_URL, force_rollback=True),
    metadata=sqlalchemy.MetaData(),
)


class Company(ormar.Model):
    ormar_config = base_ormar_config.copy(tablename="companies")

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    founded: int = ormar.Integer(nullable=True)


class Car(ormar.Model):
    ormar_config = base_ormar_config.copy()

    id: int = ormar.Integer(primary_key=True)
    manufacturer = ormar.ForeignKey(Company)
    name: str = ormar.String(max_length=100)
    year: int = ormar.Integer(nullable=True)
    gearbox_type: str = ormar.String(max_length=20, nullable=True)
    gears: int = ormar.Integer(nullable=True)
    aircon_type: str = ormar.String(max_length=20, nullable=True)


@create_drop_database(base_config=base_ormar_config)
async def sample_data():
    # build some sample data
    toyota = await Company.objects.create(name="Toyota", founded=1937)
    await Car.objects.create(
        manufacturer=toyota,
        name="Corolla",
        year=2020,
        gearbox_type="Manual",
        gears=5,
        aircon_type="Manual",
    )
    await Car.objects.create(
        manufacturer=toyota,
        name="Yaris",
        year=2019,
        gearbox_type="Manual",
        gears=5,
        aircon_type="Manual",
    )
    await Car.objects.create(
        manufacturer=toyota,
        name="Supreme",
        year=2020,
        gearbox_type="Auto",
        gears=6,
        aircon_type="Auto",
    )


asyncio.run(sample_data())

중첩 정의가 있는 str, List[str], Set[str] or dict 를 전달하여 지정된 필드를 선택할 수 있습니다.

관련 모델을 포함하려면 {related_name}__{column}[__{optional_next} etc.] 기호를 사용하십시오.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
올_카 = 기다려 (
    자동차. 물체
    . _ ('제조업체')
    . 필드(['id', 'name', 'er__name'])
    . 모두 ()
)
올_카의 경우:
    # 제외된 열은 없음
    모두 주장하십시오(getattr(car, x)는 ['년', 'gearbox_type', 'gears', 'aircon_type']에서 x에 대해 없음).
    # 관련 모델에 포함된 열을 사용할 수 있으며 pk 열은 항상 포함되어 있습니다.
    # 필드 목록에 포함하지 않더라도
    주장car.manufacturer.name== '도요타'
    # 또한 중첩된 관련 모델에서 - pk를 제외할 수 없습니다 - 항상 자동으로 추가됩니다
    주장 car.re.는 없음

필드()를 여러 번 호출하여 선택할 열을 작성할 수 있습니다.

선택 _lated() 호출에 관련 모델을 포함하지만 필드에서 해당 모델에 대한 열을 지정하지 않는 경우

  • 이러한 중첩 모델의 모든 필드 목록을 의미합니다.

    올_카 = 기다려 ( 자동차. 물체 . _ ('제조업체') . 필드('id') . 필드(['이름']) . 모두 () )

    회사 모델의 모든 필드가 선택됨

    모든 자동차를 주장하십시오 [0]. manufacturer.name== '도요타' 모든 _ 자동차 주장 [0] .rer. == 1937

!!! 경고는 유효성 검사 오류를 발생시키고 제외하려면 필드가 비어 있어야 하므로 필수 필드를 제외할 수 없습니다.

1
2
`values()` 방법을 사용하여 필수 필드를 제외할 수 있지만 데이터는 제외합니다.
`dict` 로 반환됩니다.

이 예에서는 필수 모델 번호 열(제조업체__이름)을 제외할 수 없습니다.

1
2
3
4
5
6
7
기다리고 있다 (
    자동차. 물체
    . _ ('제조업체')
    . 필드(['id', 'name', 'er__'])
    . 모두 ()
)
#는 company.name 필요에 따라 발열 유효성 검사를 제기합니다.

!!!Tip Pk 열은 제외할 수 없습니다. 명시적으로 포함되지 않은 경우에도 항상 자동으로 추가됩니다.

사전 또는 집합으로 포함할 필드를 전달할 수도 있습니다.

사전에 포함할 필드를 표시하려면 해당 이름을 키로 사용하고 줄임표를 값으로 사용하십시오.

중첩 모델을 횡단하려면 중첩 사전을 사용하십시오.

중첩 사전 대신 마지막 수준 필드를 포함하려면 컬렉션을 사용할 수 있습니다.

전체 중첩 모델을 포함하려면 모델과 관련된 필드 이름과 타원을 지정하십시오.

아래에서 동등한 예를 볼 수 있습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#1. 위의 예와 같이
기다리고 있다 (
    자동차. 물체
    . _ ('제조업체')
    . 필드(['id', 'name', 'er__name'])
    . 모두 ()
)

#2. 줄임표를 사용하여 필요에 따라 필드를 표시합니다.
기다리고 있다 (
    자동차. 물체
    . _ ('제조업체')
    . 필드({'id': . ..,
             '이름' :. ..,
             '제조업체': {
                 '이름' :. ..
                }
             })
    . 모두 ()
)

#3. 줄임표를 사용하여 전체 중첩 모델을 포함합니다.
기다리고 있다 (
    자동차. 물체
    . _ ('제조업체')
    . 필드({'id': . ..,
             '이름' :. ..,
             '제조업체':. ..
             })
    . 모두 ()
)

#4. 마지막 중첩 수준에서 필드를 지정하려면
# 위의 2에 해당하는 세트를 사용할 수도 있습니다.
기다리고 있다 (
    자동차. 물체
    . _ ('제조업체')
    . 필드({'id': . ..,
             '이름' :. ..,
             '제조업체': {'name'}
             })
    . 모두 ()
)

#5. 물론 세트에는 여러 필드가 있을 수 있습니다.
기다리고 있다 (
    자동차. 물체
    . _ ('제조업체')
    . 필드({'id': . ..,
             '이름' :. ..,
             '제조업체': {'name', 'founded'}
             })
    . 모두 ()
)

#6. 모든 중첩 필드를 포함할 수 있습니다.
# 그러나 그것은 3과 같을 것입니다. 위는 더 짧습니다.
기다리고 있다 (
    자동차. 물체
    . _ ('제조업체')
    . 필드({'id': . ..,
             '이름' :. ..,
             '제조업체': {'id', 'name', 'founded'}
             })
    . 모두 ()
)

!!!행을 반환하지 않는 모든 메서드는 쿼리 세트 인스턴스를 명시적으로 반환하여 함께 연결할 수 있습니다.

1
2
3
따라서 `filter()`,`select_related()`,`limit()` 및 `offset()` 등과 같은 작업을 체인으로 연결할 수 있습니다.

뭔가 `Track.objects.select_related("album").filter(album__name="Malibu").offset(1).limit(1).all()`

제외 필드

exclude_fields(columns: Union[List, str, set, dict]) -> QuerySet

_field()를 제외하고 제외할 모델 열의 하위 집합을 선택하여 데이터 로드를 제한할 수 있습니다.

필드() 방법과 반대이므로 위의 설명서를 확인하여 사용 가능한 옵션을 확인하십시오.

특히 중첩된 사전과 컬렉션이 전체 계층에서 필드를 제외하기 위해 마스크로 전달되는 방법을 확인합니다.

필드()와 _field()를 제외한 필드()는 마스터 모델(get, all 등과 같은 일반 쿼리에서)과 선택 _lated 및 프리페치 _lated 모델(중첩 표기법 사용)에 모두 적용됩니다.

아래에서 몇 가지 간단한 예를 찾을 수 있습니다.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import asyncio

import databases
import ormar
import sqlalchemy
from examples import create_drop_database
from tests.settings import DATABASE_URL

base_ormar_config = ormar.OrmarConfig(
    database=databases.Database(DATABASE_URL, force_rollback=True),
    metadata=sqlalchemy.MetaData(),
)


class Company(ormar.Model):
    ormar_config = base_ormar_config.copy(tablename="companies")

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    founded: int = ormar.Integer(nullable=True)


class Car(ormar.Model):
    ormar_config = base_ormar_config.copy()

    id: int = ormar.Integer(primary_key=True)
    manufacturer = ormar.ForeignKey(Company)
    name: str = ormar.String(max_length=100)
    year: int = ormar.Integer(nullable=True)
    gearbox_type: str = ormar.String(max_length=20, nullable=True)
    gears: int = ormar.Integer(nullable=True)
    aircon_type: str = ormar.String(max_length=20, nullable=True)


@create_drop_database(base_config=base_ormar_config)
async def sample_data():
    # build some sample data
    toyota = await Company.objects.create(name="Toyota", founded=1937)
    await Car.objects.create(
        manufacturer=toyota,
        name="Corolla",
        year=2020,
        gearbox_type="Manual",
        gears=5,
        aircon_type="Manual",
    )
    await Car.objects.create(
        manufacturer=toyota,
        name="Yaris",
        year=2019,
        gearbox_type="Manual",
        gears=5,
        aircon_type="Manual",
    )
    await Car.objects.create(
        manufacturer=toyota,
        name="Supreme",
        year=2020,
        gearbox_type="Auto",
        gears=6,
        aircon_type="Auto",
    )


asyncio.run(sample_data())


# select manufacturer but only name,
# to include related models use notation {model_name}__{column}
all_cars = await (
    Car.objects
    .select_related('manufacturer')
    .exclude_fields([
        'year',
        'gearbox_type',
        'gears',
        'aircon_type',
        'company__founded'
    ])
    .all()
)
for car in all_cars:
    # excluded columns will yield None
    assert all(getattr(car, x) is None
               for x in [
                   'year',
                   'gearbox_type',
                   'gears',
                   'aircon_type'
               ])
    # included column on related models will be available,
    # pk column is always included
    # even if you do not include it in fields list
    assert car.manufacturer.name == 'Toyota'
    # also in the nested related models,
    # you cannot exclude pk - it's always auto added
    assert car.manufacturer.founded is None

# fields() can be called several times,
# building up the columns to select
# models included in select_related 
# but with no columns in fields list implies all fields
all_cars = await (
    Car.objects
    .select_related('manufacturer')
    .exclude_fields('year')
    .exclude_fields(['gear', 'gearbox_type'])
    .all()
)
# all fields from company model are selected
assert all_cars[0].manufacturer.name == 'Toyota'
assert all_cars[0].manufacturer.founded == 1937

# cannot exclude mandatory model columns,
# company__name in this example - note usage of dict/set this time
await (
    Car.objects
    .select_related('manufacturer')
    .exclude_fields([{'company': {'name'}}])
    .all()
)
# will raise pydantic ValidationError as company.name is required

!!!경고, 필수 필드는 유효성 검사를 발생시키기 때문에 제외할 수 없습니다. 필드를 제외하려면 null이어야 합니다.

1
2
`values()` 메소드는 필수 필드를 제외하는 데 사용할 수 있지만 데이터는 제외됩니다.
로 반환 `dict` 네.

!!! Pk 열을 제외할 수 없다는 팁 - 명시적으로 제외하더라도 항상 자동으로 추가됩니다.

!!!행을 반환하지 않는 모든 메서드는 쿼리 세트 인스턴스를 명시적으로 반환하여 함께 연결할 수 있습니다.

1
2
3
따라서 `filter()`,`select_related()`,`limit()` 및 `offset()` 등과 같은 작업을 체인으로 연결할 수 있습니다.

뭔가 `Track.object.select_related("album").filter(album__name="Malibu").offset(1).limit(1).all()`

QuerysetProxy 방법

관련 ManyTo많이 필드 및 ReverseForeignKey에 직접 액세스하면 관련 모델 목록이 반환됩니다.

그러나 쿼리 세트 API의 하위 집합도 표시되므로 상위 모델에서 직접 필터링, 생성, 관련 모델 선택 등을 할 수 있습니다.

필드

위의 필드와 동일하게 작동하지만 관계의 다른 쪽 끝에 있는 관련 개체에서 열을 선택할 수 있습니다.

!!!QuerysetProxy에 대해 자세히 알아보려면 QuerysetProxy 섹션을 방문하십시오.

제외 필드

위의 예외 _field 함수와 동일하지만 관계의 다른 쪽 끝에 있는 관련 개체에서 열을 선택할 수 있습니다.

!!!QuerysetProxy에 대해 자세히 알아보려면 QuerysetProxy 섹션을 방문하십시오.