U E D R , A S I H C RSS

django/Retrieving Object

λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ λ ˆμ½”λ“œλΌ μ‘°νšŒν•  λ•ŒλŠ” Modelν΄λž˜μŠ€λΌ κ΄€λ¦¬ν•˜λŠ” Managerν΄λž˜μŠ€λΌ μ΄μš©ν•œλ‹€. κ°€μž₯ κ°„λ‹¨ν•˜κ²ŒλŠ” λͺ¨λ“  λ ˆμ½”λ“œλΌ κ°€μ Έμ˜€λŠ” 방법이 μžˆλŠ”λ°, λͺ¨λΈλ§ˆλ‹€ 기본적으둜 μ œκ³΅λ˜λŠ” objectλΌλŠ” λ§€λ‹ˆμ €λΌ μ΄μš©ν•œλ‹€. object λ§€λ‹ˆμ €λ‘œ λ ˆμ½”λ“œλΌ μ‘°νšŒν•˜λ©΄ QuerySet이 λ°˜ν™˜λœλ‹€. μ΄λŠ” κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ CLI인 JDBC의 ResultSetκ³Ό μœ μ‚¬ν•˜λ‹€.

filter

ν•œ λͺ¨λΈμ— λŒ€ν•΄μ„œλŠ” μ—¬λŸ¬ 가지 ν•„ν„°λΌ μ„μΉ˜ν•  수 μžˆλ‹€. ν•„ν„°λŠ” SQLλ¬Έμ—μ„œ whereμ ˆμ— ν•΄λ‹Ήν•˜λŠ” 역할을 ν•œλ‹€. ν•„ν„°μ—λŠ” κ²€μƒ‰ν•˜λŠ” 컬럼의 μ™„μ „ 일치, λΆ€λΆ„ 일치, 사이 κ°’, 포함, 연월일 μ˜΅μ…˜μ„ μ„ μˆ˜ μžˆλ‹€. 기본적으둜 ν•„ν„°λŠ” AND μ‘°ν•©μœΌλ‘œ 이루어지며, OR쑰합을 μ‚¬μš©ν•˜κ³  μ‹Άλ‹€λ©΄ QλΌλŠ” 쿼리 μ˜€λΈŒμ νŠΈλΌ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.9 μ•„λž˜λŠ” ν•„ν„°λΌ μ΄μš©ν•΄ 보고 λ‚ μ§œκ°€2006λ…„ 10μ›” 1일 이후인 μœ„ν—˜ λ³΄κ³ μ„œλΌ μ°ΎλŠ” pythonμ½”λ“œμ™€ 그에 ν•΄λ‹Ήν•˜λŠ” SQL문을 보여μ€λ‹€.
RiskReport.objects.filter(date__gt=datetime.date(2006, 10, 1)) 
SELECT ... FROM risk_report
WHERE date > '2006-10-1'

select_related

μΌλŒ€λ‹€ 관계인 λ ˆμ½”λ“œμ˜ κ²½μš°λŠ” selete_relatedλ©”μ†Œλ“œλΌ μ΄μš©ν•˜λ©΄ λ°μ΄ν„°λ² μ΄μŠ€ μ ‘κ·Ό νšŸμˆ˜λΌ μ„일 수 μžˆλ‹€. 일반적인 λ°μ΄ν„°λ² μ΄μŠ€ μ‘°νšŒλŠ” μΆ”μƒν™”λ˜μ–΄μžˆμ–΄ μ‹€ν–‰ν•  λ•Œλ§ˆλ‹€ μΏΌλ¦¬λΌ μˆ˜ν–‰ν•œλ‹€. ν•˜μ§€λ§Œ selete_relatedλ©”μ†Œλ“œλΌ μ‚¬μš©ν•˜λ©΄ ν•œ 번 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ κ²°κ³ΌλΌ κ°€μ Έμ˜¨ ν›„ ν•„μš”ν•  λ•ŒλŠ” μ΄λΌ κ·ΈλŒ€λ‘œ μ‚¬μš©ν•œλ‹€. λ‹€μŒ μ˜ˆμ œμ—μ„œ 두 방식이 μ–΄λ–»κ²Œ λ‹€λ₯Έμ§€ 확인할 수 μžˆλ‹€.
# λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ ν•œ 번 값을 κ°€μ Έμ˜¨λ‹€.
c = ControlReport.objects.get(id=1)
# Employeeν…Œμ΄λΈ”μ— μ ‘κ·Όν•˜κΈ° μœ„ν•΄ λ‹€μ‹œ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 값을 κ°€μ Έμ˜¨λ‹€.
r = c.reporter
# λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 값을 λΈλ¦¬ κ°€μ Έμ˜¨λ‹€.
c = ControlReport.objects.select_related().get(id=1)
# 이전에 Employeeκ°’κΉŒμ§€ κ°€μ Έμ™”κΈ° λ•Œλ¬Έμ— λ‹€μ‹œ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 값을 κ°€μ Έμ˜€μ§€ μ•ŠλŠ”λ‹€.
r = c.reporter

extra

μ‚¬μš©μžλŠ” μ›ν•˜λŠ” 경우 extraλ©”μ„œλ“œλΌ μ΄μš©ν•΄ μ›ν•˜λŠ” μ»¬λŸΌμ„ μΆ”κ°€ν•œ κ²°κ³ΌλΌ μ–»μ„ 수 μžˆλ‹€. λ‹€μŒμ€ 2006λ…„ 1μ›” 1일 이후 λ³΄κ³ μ„œλΌ μ΅œμ‹ μœΌλ‘œ ν‘œμ‹œν•˜λŠ” μ»¬λŸΌμ„ 가진 리포트 μ •λ³΄λΌ κ°€μ Έμ˜¨λ‹€.
RiskReport.objects.extra(select={'is_recent': " date > '2006-01-01'"})
μ΄λŠ” λ‹€μŒ SQLκ³Ό κ°™λ‹€.
SELECT blog_entry.*, (pub_date > '2006-01-01')
FROM blog_entry;
extraλ©”μ†Œλ“œλΌ μ‚¬μš©ν•˜λ©΄ λ‹€μŒκ³Ό 같은 쑰금 λ³΅μž‘ν•œ μ§ˆμ˜λ„ ν•  수 μžˆλ‹€. 각 직원이 λͺ‡ λ²ˆμ΄λ‚˜ μœ„ν—˜ λ³΄κ³ μ„œλΌ μž‘μ„±ν–ˆλŠ”μ§€ μ•Œμ•„λ‚Έλ‹€.
Employee.objects.extra(
    select={
        'num_of_report': 'SELECT COUNT(*) FROM risk_report WHERE risk_report.reporter = employee.id'
    },
)
SELECT employee.*, (SELECT COUNT(*) FROM risk_report WHERE risk_report.reporter = employee.id)
FROM employee;
whereμ ˆμ„ μ‚¬μš©ν•˜λŠ” 것 μ—­μ‹œ κ°€λŠ₯ν•˜λ‹€.7 ν•˜μ§€λ§Œ μ€‘μ²©μ§ˆμ˜λŠ” μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€.
RiskReport.objects.extra(where=['id IN (3, 4, 5, 20)'])
SELECT * FROM risk_report WHERE id IN (3, 4, 5, 20);

values

μ‚¬μš©μžλŠ” valuesν•¨μˆ˜λΌ μ΄μš©ν•΄μ„œ μ›ν•˜λŠ” 속성을 지정할 수 μžˆλ‹€. μ΄λŠ” 검색 쑰건을 만μ±ν•˜λŠ” λ ˆμ½”λ“œμ˜ ν•„μš”ν•œ μ†μ„±λ§Œμ„ μ΄μš©ν•˜λ€λ‘œ νš¨μœ¨μ μ΄λ‹€. λ˜ν•œ valuesν•¨μˆ˜λŠ” QuerySet을 μƒμ†ν•œ ValuesQuerySet을 λ¦¬ν„΄ν•˜λ€λ‘œ λ‹€μ‹œ μœ„μ—μ„œ μ‚¬μš©ν•œ 검색 쑰건을 μ‚¬μš©ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ ValuesQuerySet은 μ‚¬μ „ν˜•(dictionary) μžλ£Œκ΅¬μ‘°λΌ κ°€μ§€κ³  있기 λ•Œλ¬Έμ—, λ§Žμ€ 수의 λ ˆμ½”λ“œλΌ μ–»μ–΄μ˜€κΈ°μ—λŠ” λΆ€μ μ ˆν•˜λ‹€. λ‹€μŒμ€ 사원 μ •λ³΄μ—μ„œ 이메일 μ†μ„±λ§Œμ„ μ–»μ–΄μ˜¨λ‹€.
Employee.objects.values('email') 

join

Djangoμ—μ„œ 기본적으둜 μ œκ³΅ν•˜λŠ” 쑰인 연산은 μ—†λ‹€. SQL문을 직접 μˆ˜ν–‰ν•˜μ—¬ μ›ν•˜λŠ” κ²°κ³ΌλΌ μ–»μ„ 수 μžˆλ‹€. μ΄λŠ” JDBC의 μΈν„°νŽ˜μ΄μŠ€μ™€ λΉ„μŠ·ν•˜λ©°, μ»€μ„œλΌ μ΄μš©ν•˜μ—¬ μ§ˆμ˜λΌ μˆ˜ν–‰ν•œ κ²°κ³ΌλΌ ν•˜λ‚˜μ”© μ–»μ–΄μ˜€λŠ” 방식을 μ‚¬μš©ν•œλ‹€. λ‹€μŒμ€ νŠΉμ • λΆ€μ„œ μ—μ„œ μ‹œν–‰ν•œ μœ„ν—˜ 관리 λŒ€μ±…μ„ μ–»μ–΄μ˜€λŠ” ν•¨μˆ˜μ΄λ‹€.
def getDartmentControl(depart_id):
    from django.db import connection
    cursor = connection.cursor()
qeury=' ' '
select report_controlreport.content 
from report_controlreport, report_department_employees
where report_department_employees.department_id = report_department_employees.employee_id 
   and report_department_employees.employee_id = report_controlreport.reporter_id
   and report_department_employees.department_id= %d' ' '
    cursor.execute(query, [depart_id])
    row = cursor.fetchone()
    return row

----
django/Example
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:31:39
Processing time 0.0187 sec