본문 바로가기
python/Django

Django 모델 컨벤션

by Redking

현재 근무 중인 회사에서 사용 중인 Django model의 컨벤션입니다. django 공식문서에 작성되어 있는 컨벤션과는 다른 형태를 가지고 있다는 점이 조금 안타깝긴 하지만 프로젝트 내에 이미 통일된 컨벤션으로 이용되고 있기 때문에 수정하지 않았습니다.

모델 클래스 내 코드 순서

  1. 상수 (EX. choices 인자로 설정할 값) : 대문자
  2. 이미지 필드의 upload_to 인자로 설정할 메소드
  3. 필드
  4. 프로퍼티 : get_ 이름 사용 불가능
  5. 메소드 : get_ 이름 사용 가능
  6. save() 메소드
  7. delete() 메소드
  8. __str__() 메소드 : 필수 (모델 자체의 verbose_name 역할)
  9. Meta 클래스
class SampleModel(models.model):
    TYPE_CHOICES = (
        (0, 'one'),
        (1, 'two'),
        (3, 'three'),
    )
    
    def get_image_path_base(self, filename, fieldname):
        imagefile_dir = 'images/{}/{}/'.format(fieldname, self.id)
        imagefile_ext = os.path.splitext(filename)[-1][1:].lower()
        imagefile_name = '{}.{}'.format(self.id, imagefile_ext)
        return os.path.join(imagefile_dir, imagefile_name)
    
    
    def get_sub_image_path(self, filename):
        return self.get_artwork_path_base(filename, 'sub_image')
    
    image = models.ImageField('sub image', upload_to=get_sub_image_path)
    type = models.SmallIntegerField('숫자', choices=TYPE_CHOICES)
    first_name = models.CharField('이름', max_length=128)
    last_name = models.CharField('성', max_length=128)
    
        
    @property
    def full_name(self):
        return '{}_{}'.format(self.first_name, self.last_name)
    
    def update_name(self, old, new):
    	result = None
    		...
        return result
        
    def save(self, *args, **kwargs):
    		...
        super(SampleModel, self).save(*args, **kwargs)
        
    def delete(self, *args, **kwargs):
    		...
        super(SampleModel, self).delete(*args, **kwargs)

    def __str__(self):
        return self.id

    class Meta:
        ordering = ['type', '-id']

 

Django 공식 문서 내에 있는 컨벤션

다행히 필수는 아니기 때문에 기존 컨벤션을 유지 하였습니다.

코드 컨벤션 : 공통

  • choices 인자로 설정할 값들은 대문자로 선언하여 클래스 내 최상단에 작성하는 것을 원칙으로 합니다.
  • 기본적으로 필드들은 추가 개행 없이 붙여 쓰는 것을 원칙으로 하되, 가독성을 위해 의미 단위로 블록을 나눌 수는 있습니다.
  • Log 기능을 위해 verbose_name 인자는 필수로 설정해 주며, 가장 첫 번째 인자여야 합니다. 이때는 인자 이름(verbose_name)을 생략해줍니다. 단, ForeignKey, ManyToManyField, OneToOne 필드의 경우에는 두 번째 인자로 설정해 줘야 하며, 인자 이름(verbose_name)을 반드시 명시해 줘야 합니다.
  • null 인자 또는 default 인자가 필요한 경우, 이들은 맨 뒤에 위치해야 합니다. 단, null=True인 경우에는 default 인자가 필요 없고 null=False인 경우는 null 인자를 생략해도 되므로 두 인자는 공존하면 안 됩니다.
  • ForiegnKey, ManyToManyField, OneToOne 필드의 인자 순서
    • to : 인자 이름을 명시하지 않고 항상 문자열로 설정해 주는 것으로 통일
    • verbose_name : Log 기능을 위해 항상 설정해주는 것으로 통일
    • related_name, related_query_name : 항상 명시적으로 설정해 주는 것으로 통일
    • on_delete : ManyToManyField 필드의 경우에는 필요 없음
    • through : ManyToManyField 필드에서만 의미가 있음
    • null : null=False인 경우에는 생략 가능
    • default : null=True인 경우에는 생략 가능

코드 컨벤션 : 필드별 인자 순서

  • ForeignKey(to, verbose_name, related_name, related_query_name, on_delete, null)
  • OneToOneField(to, verbose_name, related_name, related_query_name, on_delete, null)
  • ManyToManyField(to, verbose_name, related_name, related_query_name, through)
  • GenericRelation(to, verbose_name, related_query_name)
  • PositiveSmallIntegerField(verbose_name, choices, null, default)
    SmallIntegerField(verbose_name, choices, null, default)
  • CharField(verbose_name, max_length, choices, unique, null, default)
    EmailField(verbose_name, max_length, choices, unique, null, default)
    TextField(verbose_name, blank=True)
  • BooleanField(verbose_name, default)
  • DateField(verbose_name, null, default)
    TimeField(verbose_name, null, default)
    DateTimeField(verbose_name, null, default)
  • ImageField(verbose_name, upload_to, null)
    FileField(verbose_name, upload_to, null)
  • ArrayField(verbose_name, base_field, default)
  • JSONField(verbose_name, default)

댓글