콘텐츠로 이동

쿼리 세트 에이전트

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

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

!!!기본적으로 공개 쿼리 세트는 상위 모델과 관련된 모델만 반환하도록 필터링되었습니다.

1
따라서 `post.categories.all()` 를 발행하면 해당 게시물과 관련된 모든 범주를 얻을 수 있습니다. 모든 범주가 테이블에 있는 것은 아닙니다.

!!!QuerysetProxy를 통해 Query세트 API 메서드에 액세스할 때 일반 쿼리처럼 개체 속성을 사용할 필요가 없습니다.

1
2
3
그러니 참고하세요 `post.categories.all()` 그리고 **아니** `post.categories.objects.all()` 네.

사용 가능한 쿼리 세트 방법에 대해 자세히 알아보려면[쿼리][queries]를 방문하십시오.

!!!ManyToMan의 경고 쿼리 관련 모델은 상위 모델에 로드된 관련 모델 목록을 지웁니다.

1
2
3
4
5
6
7
8
9
예:`post.categories.first()` 는 post.를 관련 모델 1개 목록으로 설정합니다 -> 먼저 반환된 모델()

예 2: 게시물에 4개의 카테고리가 있는 경우 `len(post.categories) == 4` 가 `post.categories.limit(2).all()` 를 호출합니다.
-> 어린이 2명만 로드합니다. `assert len(post.categories) == 2`

이는 데이터를 반환하는 모든 QuerysetProxy 메서드에 대해 발생합니다. `get`, `all` 그리고 `first` 그리고 `get_or_create` 모델이 이미 존재하는 경우.

에 의해 반환된 값 참고 `create` 또는 에서 생성 `get_or_create` 그리고 `update_or_create`
모델이 존재하지 않으면 관계 목록에 추가됩니다(지우지 않음).

데이터베이스에서 데이터 읽기

겟

가져오기(**kwargs):-> 모델

이름으로 필터링된 관련 모델 중 하나만 얻으려면 get(**kwargs) 방법을 사용할 수 있습니다.

1
2
3
4
5
6
7
8
9
# 하나의 카테고리 잡기
뉴스 주장 == 게시를 기다립니다.y.get (이름 = "뉴스")

# 이 값을 잡을 수 있도록 메소드가 범주를 반환합니다.
# 그러나 제자리에 있는 관련 모델 목록도 수정합니다.
# 이전에 부모 모델에 로드된 내용에 관계없이
# 이제 그것은 하나의 가치만 가지고 있습니다 -> 그냥 get () 호출로 로드되었습니다
주장 렌 (포스트.카테고리) == 1
포스트.카테고리 주장 [0] == 뉴스

팁

획득 또는 생성

get_or_create(_defaults: Optional[Dict[str, Any]] = None, **kwargs) -> Tuple[Model, bool]

기준을 충족하는 행을 가져오려고 시도하고 NoMatch 예외가 발생하면 지정된 kwargs 및 _de로 새 행이 생성됩니다.

팁

모두

all(**kwargs) -> List[Optional["Model"]]

관련 모델 목록을 얻으려면 모두() 방법을 사용하십시오.

일반 쿼리와 마찬가지로 쿼리 세트를 필터링하고 관련 필드를 선택하고 필드를 제외하는 등의 작업을 수행할 수 있습니다.

1
2
3
4
5
6
7
# 모든 쿼리 설정 방법 - 필터링, 열 선택, 카운트 등.
뉴스를 기다리세요.포스트.필터(title__ ="M2M") .all()
카테고리를 기다립니다. 개체. 필터 (s__ = Guido).get ()

# 많은 관계에서 많은 관계의 열 모델을 미리 가져올 수 있습니다.
News_ = 뉴스를 기다립니다. 게시물. _ ("저자") .all ()
News_[0]를 주장합니다. 저자 == 귀도

팁

반복

iterate(**kwargs) -> AsyncGenerator["Model"]

관련 모델을 반복하려면 반복() 방법을 사용하십시오.

일반 쿼리와 마찬가지로 쿼리 세트를 필터링하고 관련 필드를 선택하고 필드를 제외하는 등의 작업을 수행할 수 있습니다.

1
2
3
# 비동기 생성기를 사용하여 이 게시물의 범주를 반복합니다.
Post.ories.iterate()의 범주에 대한 비동기화:
    인쇄(category.name)

팁

데이터베이스에 데이터 삽입/업데이트

만들기

생성(**kwargs):-> 모델

상위 모델에서 직접 관련 모델을 만듭니다.

데이터베이스의 연결된 테이블 및 관계형 ID가 자동으로 채워집니다.

1
2
3
4
# 인스턴스에서 열 개체 만들기:
게시물을 기다리고 있습니다.y.create (이름 = "팁")
주장 len (게시물을 기다립니다. ories.all ()) == 2
# 새로 만든 인스턴스는 이미 데이터베이스에 관계가 유지되었습니다.

팁

다대다 관계의 경우 명시적으로 제공된 통과 모델에 추가 필드를 선언하는 경우 통과 모델을 생성하는 데 사용할 매개 변수를 전달하는 추가 기능이 있습니다.

이러한 샘플이 제공됩니다.

 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
import databases
import ormar
import sqlalchemy

DATABASE_URL = "sqlite:///test.db"

ormar_base_config = ormar.OrmarConfig(
    database=databases.Database(DATABASE_URL), metadata=sqlalchemy.MetaData()
)


class Category(ormar.Model):
    ormar_config = ormar_base_config.copy(tablename="categories")

    id = ormar.Integer(primary_key=True)
    name = ormar.String(max_length=40)


class PostCategory(ormar.Model):
    ormar_config = ormar_base_config.copy(tablename="posts_x_categories")

    id: int = ormar.Integer(primary_key=True)
    sort_order: int = ormar.Integer(nullable=True)
    param_name: str = ormar.String(default="Name", max_length=200)


class Post(ormar.Model):
    ormar_config = ormar_base_config.copy()

    id: int = ormar.Integer(primary_key=True)
    title: str = ormar.String(max_length=200)
    categories = ormar.ManyToMany(Category, through=PostCategory)

다음과 같은 방법으로 생성() 호출에서 모델별로 필드를 채울 수 있습니다.

1
2
3
4
5
6
7
게시물 = 대기 게시물(제목 = "테스트 게시물").저장()
게시물을 기다리고 있습니다.
    이름 = "테스트 범주 1",
    # 인수에서 통과 필드 및 키의 이름이 포함된 사전을 전달합니다.
    # 전체 모델 필드에 해당
    포스트 카테고리 ={"sort_order": 1, "param_name": "volume"},
)

획득 또는 생성

get_or_create(_defaults: Optional[Dict[str, Any]] = None, **kwargs) -> Tuple[Model, bool]

기준을 충족하는 행을 얻으려고 시도하고 NoMatch 예외가 발생하면 지정된 kwargs를 사용하여 새 행이 생성됩니다.

팁

업데이트 또는 생성

update_or_create(**kwargs) -> Model

모델을 업데이트하거나 데이터베이스에 일치하는 모델이 없는 경우 새 모델을 만듭니다.

!!!팁 쿼리 문서 업데이트 _ 또는 _ 생성에서 자세히 보기

업데이트

update(**kwargs, each:bool = False) -> int

제공된 키워드 매개 변수로 관련 모델을 업데이트하고 업데이트된 행 수를 반환합니다.

팁

필드 이름과 필드 사전이 있는 매개 변수는 다대다 관계 업데이트에도 허용될 수 있습니다.

 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
import databases
import ormar
import sqlalchemy

DATABASE_URL = "sqlite:///test.db"

ormar_base_config = ormar.OrmarConfig(
    database=databases.Database(DATABASE_URL), metadata=sqlalchemy.MetaData()
)


class Category(ormar.Model):
    ormar_config = ormar_base_config.copy(tablename="categories")

    id = ormar.Integer(primary_key=True)
    name = ormar.String(max_length=40)


class PostCategory(ormar.Model):
    ormar_config = ormar_base_config.copy(tablename="posts_x_categories")

    id: int = ormar.Integer(primary_key=True)
    sort_order: int = ormar.Integer(nullable=True)
    param_name: str = ormar.String(default="Name", max_length=200)


class Post(ormar.Model):
    ormar_config = ormar_base_config.copy()

    id: int = ormar.Integer(primary_key=True)
    title: str = ormar.String(max_length=200)
    categories = ormar.ManyToMany(Category, through=PostCategory)

위의 예에서 다음 호출에서 포스트 카테고리의 속성을 업데이트할 수 있습니다.

1
2
3
게시물을 기다리고 있습니다. ories.필터(이름 = "테스트 범주3").업데이트(
            포스트 카테고리 ={"sort_order": 4}
        )

필터링 및 정렬

필터

filter(*args, **kwargs) -> QuerySet

모델 속성/필드별로 필터링하고 FK 관계 전반에 걸쳐 필터를 사용하여 인스턴스를 가져올 수 있습니다.

팁

제외

exclude(*args, **kwargs) -> QuerySet

필터와 정확히 동일하게 작동하며 모든 한정자(접미사)는 동일하지만 not 조건이 반환됩니다.

팁

주문 기준

order_by(columns:Union[List, str]) -> QuerySet

순서_by()를 사용하여 선택한 필드별로 데이터베이스의 결과를 정렬할 수 있습니다.

!!!팁 쿼리 문서 순서에서 자세히 보기_by

가입 및 하위 쿼리

관련 선택

select_related(related: Union[List, str]) -> QuerySet

동일한 쿼리 중에 관련 모델을 미리 가져올 수 있습니다.

선택_lated를 사용하면 항상 데이터베이스에 대해 하나의 쿼리만 실행됩니다. 즉, (때로는 복잡한) 조인이 생성되고 나중에 중첩된 모델이 파이썬에서 처리됩니다.

!!!팁 쿼리 문서에서 _lated 선택에 대해 자세히 알아보십시오.

프리페치 상관 관계

prefetch_related(related: Union[List, str]) -> QuerySet

쿼리 중에 관련 모델을 미리 가져올 수 있지만 _lated를 선택하는 대신 각 후속 모델은 별도의 데이터베이스 쿼리로 가져옵니다.

프리페치_lated를 사용하면 각 모델이 데이터베이스에 대해 하나의 쿼리를 실행하므로 여러 쿼리를 차례로 실행합니다.

!!!팁 쿼리 문서에서 자세히 보기 프리페치 _lated

페이지 및 줄

페이징

paginate(page: int, page_size: int = 20) -> QuerySet

페이지 번호 및 크기에 따라 오프셋 및 제한 방법을 결합합니다.

팁

제한

limit(limit_count: int) -> QuerySet

결과를 필요한 상위 모델 수로 제한할 수 있습니다.

팁

오프셋

offset(offset: int) -> QuerySet

필요한 마스터 모델 수로 결과를 상쇄할 수 있습니다.

팁

열의 하위 집합 선택

필드

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

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

팁

제외 필드

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

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

!!!팁 _field를 제외한 쿼리 문서에서 자세히 알아보기

집계 함수

카운트

count(distinct: bool = True) -> int

지정된 기준과 일치하는 행 수(즉, 필터 및 제외 적용)를 반환합니다.

팁

존재

존재 () -> 부울

지정된 기준을 충족하는 행이 있는지 확인하기 위해 부울 값을 반환합니다(필터 및 제외와 함께 적용됨).

팁