Django

GreenBeanΒ·2021λ…„ 5μ›” 16일
0
post-thumbnail

Django

Q object

  • filter, exclude, getκ³Ό 같은 쑰회 ν•¨μˆ˜μ™€ ν•¨κ»˜ μ‚¬μš©ν•΄μ„œ λ³΅μž‘ν•œ 쑰건 검색을 효율적으둜 ν•  수 있음
  • 검색 쑰건이 λ³΅μž‘ν•΄μ§€λ©΄ filter()μ•ˆμ— λ“€μ–΄κ°€μ•Ό ν•  것듀이 λ§Žμ•„μ§€λ©΄μ„œ κΈΈμ–΄μ§€κ²Œ λ˜λŠ”λ°, μ΄λ ‡κ²Œ λ³΅μž‘ν•œ 필터링 쑰건을 κ±Έμ–΄μ•Όν•  λ•Œ Q 객체λ₯Ό μ‚¬μš©ν•˜λ©΄ 효율적이고 가독성도 높아짐
  • filter()λŠ” AND μ—°μ‚°μžκ°€ 포함 되기 λ•Œλ¬Έμ— OR μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” κ²½μš°μ—λŠ” Q 객체λ₯Ό μ‚¬μš©ν•΄μ•Ό 함
  • Q 객체λ₯Ό μ΄μš©ν•˜λ©΄ SQL 질의문의 WHERE μ ˆμ— ν•΄λ‹Ήν•˜λŠ” κΈ°λŠ₯을 μ˜¨μ „νžˆ ν™œμš© κ°€λŠ₯

OR μ—°μ‚° & AND μ—°μ‚°

  • Q objectsλŠ” &와 |의 μ‚¬μš©μ΄ κ°€λŠ₯
>>> from django.db.models import Q
>>> queryset = User.objects.filter(
    Q(first_name__startswith='R') | Q(last_name__startswith='D')
    )
>>> queryset
<QuerySet [<User: Ricky>, <User: Ritesh>, <User: Radha>, <User: Raghu>, <User: rishab>]>
>>> queryset = User.objects.filter(
    Q(first_name__startswith='R') & Q(last_name__startswith='D')
    )
>>> queryset
<QuerySet [<User: Ricky>, <User: Ritesh>, <User: rishab>]>
  • Q objects λŠ” '~' μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬΄νš¨ν™”ν•  수 μžˆμœΌλ―€λ‘œ 일반 쿼리와 λΆ€μ • 쿼리(NOT)λ₯Ό κ²°ν•©ν•œ 쑰회λ₯Ό ν—ˆμš©
Q(question__startswith='Who' | ~Q(pub_date__year=2005)
  • ν‚€μ›Œλ“œ 인수λ₯Ό μ‚¬μš©ν•˜λŠ” 각 쑰회 ν•¨μˆ˜(Lookup Functions)λŠ” ν•˜λ‚˜ μ΄μƒμ˜ Q objects λ₯Ό μœ„μΉ˜ μ§€μ •λ˜μ§€ μ•Šμ€ 인수둜 전달 κ°€λŠ₯
    • ν‚€μ›Œλ“œ 인수 : filter(), exclude(), get()
  • 쑰회 ν•¨μˆ˜μ— μ—¬λŸ¬ 개의 Q objects 인수λ₯Ό μ œκ³΅ν•˜λ©΄ μΈμˆ˜λŠ” ANDκ°€ 됨
Poll.objects.get(
    Q(question__startswith='Who'),
    Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
  • 쑰회 ν•¨μˆ˜λŠ” Q objects와 ν‚€μ›Œλ“œ 인수의 μ‚¬μš©μ„ ν˜Όν•©ν•  수 μžˆλŠ”λ° 쑰회 ν•¨μˆ˜μ— 제곡된 λͺ¨λ“  μΈμˆ˜λŠ” ADDκ°€ 됨
  • Q objectsκ°€ 제곡되면 ν‚€μ›Œλ“œ 인수의 μ •μ˜ μ•žμ— 와야 함
Poll.objects.get(
   question__startswith='Who',
   Q(pub_date=date(2005, 5, 2) | pub_date=date(2005, 5, 6)),
)
profile
🌱 Backend-Dev | hwaya2828@gmail.com

0개의 λŒ“κΈ€