Django ORM으로 임의의 레코드를 선택하는 방법

2916 단어 django
최근에는 내 사이트에 보다 정교한 배너를 구현하여 내 iOS apps 를 홍보하고 싶었습니다. 처음에는 템플릿에 하드코딩된 배너가 하나만 있었지만 여러 배너에서는 작동하지 않았습니다.

가장 오래 걸린 부분은 페이지에 임의의 배너를 표시하는 것이었습니다. 여기에는 주로 데이터베이스에서 임의의 레코드(또는 원하는 경우 엔터티)를 가져오는 것이 포함됩니다. 나는 꽤 많은 솔루션을 찾았지만 삭제된 레코드 + 순차 ID가 없는 테이블이 있어야 하는 것처럼 너무 복잡하거나 일부 전제 조건에 의존한 다음 마지막 ID 또는 개수와 같은 것을 사용하고 그 중에서 임의의 숫자를 선택할 수 있습니다.

내 솔루션에는 요구 사항이 없지만 10만 개 이상의 레코드 중에서 선택해야 하는 경우 문제가 될 수 있습니다.

어쨌든 코드로 넘어가자. 내Banner는 속성is_active으로 토글할 수 있으므로 사용 가능한 모든 ID를 가져오기 위해 filter와 함께 Django ORMvalues을 사용하고 있습니다. 이와 같이:

banner_ids = Banner.objects.filter(is_active=True).values('id')

완료되면 결과가 비어 있지 않은지 확인할 수 있으며 그렇지 않은 경우 choice 양식 random 모듈을 사용하여 임의의 요소를 선택할 수 있습니다.

import random

if len(banner_ids) > 0:
    random_id = random.choice(banner_ids)["id"]

    try:
        banner = Banner.objects.get(pk=random_id)
    except Banner.DoesNotExist:
        banner = None
banners_ids는 기본적으로 키-값 쌍의 "배열"이기 때문에 숫자만 뽑아내는 ["id"] 첨자가 있습니다. 임의의 ID가 있으면 이를 사용하여 get 메서드로 레코드를 가져올 수 있습니다.

그게 다야!

내 사용 사례와 작업할 데이터가 많지 않다고 가정하는 다른 많은 경우에 이것이 꽤 좋다고 생각합니다.

배너가 몇 개 있고 페이지가 캐시되어 있으므로 성능에 대해 거의 생각할 필요가 없습니다.

여기와 내 블로그에 Django에 대해 씁니다nemecek.be.

좋은 웹페이지 즐겨찾기