Skip to content

Latest commit

Β 

History

History

Django

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Β 
Β 

Django

기본적으둜 Django κ³΅μ‹λ¬Έμ„œ μ½”λ“œμŠ€νƒ€μΌμ˜ κ·œμΉ™μ„ λ”°λ¦…λ‹ˆλ‹€.

Model

Naming

λͺ¨λΈμ˜ 이름은 ν”„λ‘œμ νŠΈ λ‚΄μ—μ„œ μœ μΌν•˜λ©΄ μ’‹μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 의미λ₯Ό λͺ…ν™•ν•˜κ²Œ ν•˜λŠ” 것이 더 μ’‹κ³  이에 λ”°λ₯Έ 쀑볡을 ν—ˆμš©ν•©λ‹ˆλ‹€.

λ‹€μŒκ³Ό 같은 쀑볡을 ν—ˆμš©ν•©λ‹ˆλ‹€.

apps.transactions.models.Transaction
apps.accounting.models.Transaction

μ€‘λ³΅μœΌλ‘œ λ°œμƒν•  수 μžˆλŠ” μž‘μ€ λ¬Έμ œλ“€μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ‹€μŒκ³Όκ°™μ€ Aliasλ₯Ό 적극 ν™œμš©ν•©λ‹ˆλ‹€.

from apps.accounting.models import Transaction as AccountingTransaction

Order

λͺ¨λΈ 클래슀 내뢀에 클래슀, ν•„λ“œ, λ©”μ„œλ“œλ“€μ„ μ •μ˜ν•˜λŠ” μˆœμ„œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. Fields
  2. Custom Manager Attributes
  3. class Meta
  4. def __str__()
  5. def save()
  6. def get_absolute_url()
  7. Any Custom Methods

Field

ν•„λ“œ μ •μ˜

λͺ¨λΈμ„ μ •μ˜ν•  λ•Œ μΈμžλ§ˆλ‹€ μ€„λ°”κΏˆν•˜μ—¬ μž‘μ„±ν•©λ‹ˆλ‹€.

# Good
user = models.Foreignkey(
    User, 
    verbose_name='μ‚¬μš©μž',
    on_delete=models.CASCADE,
)

# Bad
user = models.Foreignkey(User, 
                         verbose_name='μ‚¬μš©μž',
                         on_delete=models.CASCADE)

# Bad
user = models.Foreignkey(User, verbose_name='μ‚¬μš©μž', on_delete=models.CASCADE)

ForeignKey

μ™Έλž˜ν‚€ ν•„λ“œλͺ…은 λͺ¨λΈλͺ…을 λ”°λ¦…λ‹ˆλ‹€. verbose_name λ˜ν•œ λ™μΌν•˜κ²Œ μœ μ§€ν•©λ‹ˆλ‹€.

user = models.Foreignkey(
    User, 
    verbose_name='μ‚¬μš©μž',
    on_delete=models.CASCADE,
)

OneToOneField, ManyToManyField 도 λ™μΌν•œ κ·œμΉ™μ„ μ μš©ν•©λ‹ˆλ‹€. 단, λ³΅μˆ˜ν˜•μ΄ μ μ ˆν•œ 경우 λ³΅μˆ˜ν˜•μ„ ν—ˆμš©ν•©λ‹ˆλ‹€.

λΉ„μœ¨

  • DecimalFieldλ₯Ό 기본적으둜 μ‚¬μš©ν•©λ‹ˆλ‹€.
  • decimal_placesλ₯Ό 4둜 μ§€μ •ν•©λ‹ˆλ‹€.
  • max_digitsλŠ” μ΅œμ†Œ 4μ΄μƒμœΌλ‘œ μ§€μ •ν•©λ‹ˆλ‹€.
  • μ†Œμˆ«μ  ν˜•νƒœλ‘œ μ €μž₯ν•©λ‹ˆλ‹€. (8.88% (X), 0.0888 (O)
  • API의 κ²½μš°μ— DecimalFieldλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

κΈˆμ•‘

  • DecimalFieldλ₯Ό 기본적으둜 μ‚¬μš©ν•©λ‹ˆλ‹€.
  • decimal_placesλ₯Ό 0으둜 μ§€μ •ν•©λ‹ˆλ‹€.
  • max_digitsλŠ” ν•„λ“œμ˜ 속성에 λ§žμΆ”μ–΄ μ§€μ •ν•©λ‹ˆλ‹€.
  • API의 κ²½μš°μ— IntegerFieldλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

기타

  • IntegerField, BigIntegerField, PositiveIntegerField, PositiveSmallIntegerField 쀑에 ν•˜λ‚˜λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
  • μŒμˆ˜κ°€ κΈ°λ‘λ˜μ–΄μ•Ό ν•˜μ§€ μ•ŠλŠ” κ²½μš°λŠ” Positive ν•„λ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

Meta - Verbose Name

Verbose Name은 μ΅œλŒ€ν•œ μœ μΌν•œ 이름을 갖도둝 ν•˜μ—¬ Admin ν™”λ©΄μ—μ„œ λͺ¨λΈμ„ 효과적으둜 λΆ„λ₯˜ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

__str__

λ‹€μŒκ³Ό 같은 ν˜•μ‹μ„ λ”°λ₯΄λ©΄μ„œ μ΅œλŒ€ν•œ 짧게 str 을 μœ μ§€ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€. [{λͺ¨λΈ_ν•œκΈ€_이름} {pk}] {A}, {B}, {C}: {D}

  • {λͺ¨λΈ_ν•œκΈ€_이름} 뢀뢄은 meta.verbose_name 와 μΌμΉ˜μ‹œν‚΅λ‹ˆλ‹€.
  • pk μ—λŠ” Primary Key λ₯Ό μ“΄λ‹€. λŒ€λΆ€λΆ„μ˜ 경우 id 값이 λœλ‹€. pk 값이 ν¬ν•¨λ˜μ–΄ μžˆμ–΄μ•Ό DBμ—μ„œ μ‰½κ²Œ μ‘°νšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • A, B, C λΆ€λΆ„μ—λŠ” ν•„μš”ν•œ 정보λ₯Ό μΆ”κ°€μ μœΌλ‘œ 적어 μ€λ‹ˆλ‹€. κ·Έ κ°’μ˜ μ˜λ―Έκ°€ λͺ…ν™•ν•œ κ²½μš°μ—λŠ” key λ₯Ό ν¬ν•¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ κ·Έ μ˜λ―Έκ°€ λͺ…ν™•ν•˜μ§€ μ•Šμ€ 경우(λŒ€λΆ€λΆ„ 숫자)λŠ” key: value μŠ€νƒ€μΌλ‘œ μ μŠ΅λ‹ˆλ‹€.
[μ‚¬μš©μž 234] [email protected]
[μ˜ν™” 234] DancingQueen, μƒμ˜μ—¬λΆ€: True

Instance Method

  • λͺ¨λΈ μΈμŠ€ν„΄μŠ€μ˜ 정보가 λ³€κ²½λ˜μ–΄ λ°μ΄ν„°λ² μ΄μŠ€μ— λ°˜μ˜λ˜μ–΄μ•Ό ν•˜λŠ” κΈ°λŠ₯이 μžˆμ„ λ•Œ 이 κΈ°λŠ₯은 save() ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜λ„λ‘ ν•œλ‹€.
# Do
def publish(self):
    self.published_at = timezone.now()
    self.save()

def somewhere(post):
    post.publish()
# Don't
def publish(self):
    self.published_at = timezone.now()

def somewhere(post):
    post.publish()
    post.save()

Manager

λͺ¨λΈκ³Ό κ΄€λ ¨λœ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ λ§€λ‹ˆμ € λ©”μ„œλ“œλ‘œ μ •μ˜ν•©λ‹ˆλ‹€.

Custom Manager

μ»€μŠ€ν…€ λ§€λ‹ˆμ €λ₯Ό μ •μ˜ν•˜λŠ” 경우 λ‹€μŒκ³Ό 같은 κ·œμΉ™μ„ λ”°λ¦…λ‹ˆλ‹€.

  • objectsλŠ” 항상 μ‘΄μž¬ν•˜μ—¬μ•Ό ν•œλ‹€. objectsλŠ” μž₯고의 κΈ°λ³Έ Manager에 μ ‘κ·Όν•˜λŠ” convention이기 λ•Œλ¬Έμ— 이것을 지킀도둝 ν•©λ‹ˆλ‹€.
  • objects둜 μ§€μ •λœ custom model managerλŠ” get_queryset이 ν•„ν„°λ§λ˜μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€. 즉, Model.objects.all() == Model._default_manager.all() 이 λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • νŠΉμ • 필터링이 ν•„μš”ν•œ 경우, 의미λ₯Ό 전달할 수 μžˆλŠ” λͺ…칭을 μΆ”κ°€ν•©λ‹ˆλ‹€. ex) Transaction.valid.all()
  • κ°€λŠ₯ν•˜λ©΄ λ³΅μˆ˜ν˜•μ„ 쓰도둝 ν•©λ‹ˆλ‹€.

QuerySet Method

λ°μ΄ν„°λ² μ΄μŠ€μ™€ κ΄€λ ¨λœ ν–‰μœ„μ˜ 경우 QuerySet λ©”μ„œλ“œλ‘œ μΆ”κ°€ν•©λ‹ˆλ‹€.

λ‹€μŒ λ¬Έμ„œμ— λ‚˜μ—΄λœ λ©”μ„œλ“œλ“€κ³Ό μœ μ‚¬ν•œ ν•¨μˆ˜λŠ” QuerySet λ©”μ„œλ“œλΌκ³  λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

μž₯κ³  곡식 λ¬Έμ„œ

def opened(self):
  return self.filter(is_opened=True)

def get_total_amount(self):
    return self.aggregate(sum=Sum('amount'))['sum']

Signal

기본적으둜 Signal의 μ‚¬μš©μ„ μ§€μ–‘ν•©λ‹ˆλ‹€. μ—¬λŸ¬ λͺ¨λΈμ— 걸쳐 λ³΅μž‘ν•œ μ²˜λ¦¬κ°€ ν•„μš”ν•œ 것이 μ•„λ‹ˆλΌλ©΄ 가급적 init(), save(), delete() μ—μ„œ μ²˜λ¦¬ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.

μ‚¬μš©μ— μ ν•©ν•œ 경우

  • μ—¬λŸ¬ λͺ¨λΈμ„ λ³€κ²½ν•  λ•Œ
  • μ—¬λŸ¬ 개의 μ•±μ—μ„œ λ°œμƒν•œ ν•œ μ’…λ₯˜μ˜ μ‹œκ·Έλ„μ„ κ³΅ν†΅μœΌλ‘œ μ²˜λ¦¬ν•  λ•Œ
  • λͺ¨λΈμ΄ μ €μž₯된 이후에 μΊμ‹œλ₯Ό μ§€μš°κ³  싢을 λ•Œ
  • 콜백이 ν•„μš”ν•œλ° μ‹œκ·Έλ„μ„ μ œμ™Έν•˜κ³ λŠ” 방법이 μ—†λŠ” 경우
  • μ™ΈλΆ€ νŒ¨ν‚€μ§€ λͺ¨λΈμ˜ save(), init() 에 λŒ€ν•œ 트리거λ₯Ό κ΅¬μ„±ν•˜κ³  싢은 경우

μ ν•©ν•˜μ§€ μ•Šμ€ 경우

  • ν•˜λ‚˜μ˜ λͺ¨λΈμ— μ—°κ΄€λ˜μ–΄ 있으며 save(), delete() λ“±μ—μ„œ 처리 κ°€λŠ₯ν•œ 경우
  • μ»€μŠ€ν…€ λͺ¨λΈ λ§€λ‹ˆμ € λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•  수 μžˆμ„ λ•Œ
  • νŠΉμ • λ·°μ—λ§Œ ν•΄λ‹Ήν•˜λŠ” 경우

Choices

μž₯κ³  λͺ¨λΈ ν•„λ“œμ˜ choices λŠ” enumeration-types λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

  • choices λŠ” λͺ¨λΈ 내뢀에 μž‘μ„±ν•˜λŠ” 것을 기본으둜 ν•©λ‹ˆλ‹€.
  • λ§Œμ•½ μ—¬λŸ¬ λͺ¨λΈμ— 걸쳐 μ€‘λ³΅λ˜λŠ” choices κ°€ ν•„μš”ν•œ κ²½μš°μ—λ„ 각 λͺ¨λΈλ§ˆλ‹€ μ •μ˜ν•©λ‹ˆλ‹€.
  • λ³€μˆ˜λͺ… 및 속성은 λͺ¨λ‘ μ˜μ–΄ λŒ€λ¬Έμžμ™€ _(μ–Έλ”μŠ€μ½”μ–΄) λ₯Ό μ‘°ν•©ν•˜μ—¬λ‘œ μž‘μ„±ν•©λ‹ˆλ‹€.
  • λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯λ˜λŠ” 값은 숫자, λŒ€λ¬Έμž, _(μ–Έλ”μŠ€μ½”μ–΄) λ₯Ό μ‘°ν•©ν•˜μ—¬ μž‘μ„±ν•©λ‹ˆλ‹€.
  • chocies 의 클래슀λͺ…은 λ‹¨μˆ˜λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 끝에 Choices λ₯Ό 뢙이지 μ•ŠμŠ΅λ‹ˆλ‹€.
from django.db import models


class Model(models.Model):

    class State(models.IntegerChoices):
        PREPARE = 1, 'μ€€λΉ„'
        PROCESS = 2, '진행'
        COMPLETE = 3, 'μ™„λ£Œ'

    state = models.PositiveSmallIntegerField(
        'μƒνƒœ',
        choices=State.choices,
        default=State.PREPARE.value,
    )

View

View ν•¨μˆ˜μ—μ„œ λ°˜ν™˜ν•˜λŠ” HTTPResponse νƒ€μž… 객체λ₯Ό 생성할 λ•Œ, HTTP μƒνƒœ μ½”λ“œκ°€ 200이라면 status λ§€κ°œλ³€μˆ˜λŠ” μž…λ ₯ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

Do

from django.http.response import HttpResponse

HttpResponse()
HttpResponse(status=204)

Don’t

from django.http.response import HttpResponse

HttpResponse(status=200)