Django- 마지막 객체 생성, 동시 필터
-
12-09-2019 - |
문제
사과, 나는 장고와 파이썬을 완전히 처음 접했다.
두 가지 질문이 있습니다. 첫째, 객체 목록에서 마지막 객체 (또는 가장 높은 PK)를 어떻게 만들려면 어떻게해야합니까? 예를 들어, 나는 다음을 사용하여 첫 번째 개체를 얻을 수 있다는 것을 알고 있습니다.
list = List.objects.all()[0]
list.objects의 길이를 얻는 방법이 있습니까? list.objects.length를 시도했지만 소용이 없습니다.
둘째, 동시 필터를 만들거나 목록을 결합 할 수 있습니까? 예는 다음과 같습니다.
def findNumber(request, number)
phone_list = Numbers.objects.filter(cell=number)
위와 같은 것을 원하지만 더 좋아합니다.
def findNumber(request, number)
phone_list = Numbers.objects.filter(cell=number or home_phone=number)
올바른 구문은 무엇입니까?
해결책
나는 이것을 아직 시도하지 않았지만 나는 최신() 운영자 쿼리 세트:
최신 (field_name = 없음)
날짜 필드로 제공된 Field_name을 사용하여 날짜별로 테이블의 최신 객체를 반환합니다.
PUB_DATE 필드에 따르면이 예제는 테이블의 최신 항목을 반환합니다.
Entry.Objects.latest ( 'pub_date')
모델의 메타가 get_latest_by를 지정하면 field_name 인수를 최신 ()로 나눌 수 있습니다. Django는 기본적으로 get_latest_by에 지정된 필드를 사용합니다.
get ()와 마찬가지로, 최신 ()는 주어진 매개 변수와 함께 객체가 존재하지 않으면 doSnotexist를 올리십시오.
참고 최신 ()은 편의성과 가독성을 위해 순전히 존재합니다.
그리고 get_latest_by의 모델 문서:
get_latest_by
옵션 .get_latest_by
모델의 Datefield 또는 DateTimefield의 이름. 모델 관리자의 최신 방법에서 사용할 기본 필드를 지정합니다.
예시:
get_latest_by = "order_date"
자세한 내용은 최신 문서를 참조하십시오.
편집 : Wade는 Q () 연산자에 대한 좋은 답변을 가지고 있습니다.
다른 팁
이것은 작동합니다!
Model.objects.latest('field')
- 필드는 ID가 될 수 있습니다. 그것은 최신 ID가 될 것입니다
가장 큰 기본 키의 경우 다음을 시도하십시오.
List.objects.order_by('-pk')[0]
사용하십시오 pk
기본 키로 정의 된 필드의 실제 이름에 관계없이 작동합니다.
Django 1.6- 마지막
last()
작동합니다 first()
, 그러나 쿼리 세트에서 마지막 객체를 반환합니다.
쿼리 세트와 일치하는 마지막 객체를 반환하거나 None
일치하는 객체가없는 경우. 쿼리 세트에 주문 정의가없는 경우 기본 키에 의해 쿼리 세트가 자동으로 주문됩니다.
list = List.objects.last()
생성 된 마지막 객체를 제공합니다
쿼리에서 count () 메소드를 사용할 수 있습니다.
list = List.objects.all()
list.count()
필터에 대한 인수는 "및"ed. 해야하거나 필터가 필요한 경우 Q 개체를보십시오.http://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects
생성 된 최신 객체에 대한 대안 :
List.objects.all()[List.objects.count()-1]
목록에 항목이없는 경우 케이스에 대한 AssertionError를 추가해야합니다.
except AssertionError:
...
Django 버전에서 작업 중입니다. 1.4.22입니다. last
...도 아니다 lastet
일하고 있습니다. 최소 DB 로딩으로 해결하는 방법은 다음과 같습니다.
latest = lambda model_objects, field : model_objects.values_list( field, flat = True ).order_by( "-" + field )[ 0 ]
latest_pk = latest( List.objects, "pk" )
이 함수는 query_set을 입력으로 받아들입니다.
이 기능을 수행하여 동적으로 바인딩 할 수 있습니다.
import types
List.objects.latest = types.MethodType( latest, List.objects )
그런 다음이 최신 PK로 마지막 객체를 쉽게 얻을 수 있어야합니다.