[django] 장고 model 정리 프로그래밍

요새 장고(django)로 개발을 진행하여 서비스 런칭을 준비중이다.

그런데 이게.. 참.. php만 하다가 python을 하려니 아직 익숙치않아 헷갈리는 부분이 존재.

그래서 개인적인 참고를 하기위해 정리한다.

 

프록시 모델

from django.contrib.auth.models import User, Group, UserManager

class ProxyUserManager(UserManager):
    def get_queryset(self):
        return super().get_queryset().filter(groups__name__in=['그룹명'])

class ProxyUser(User):
    objects = ProxyUserManager()

    class Meta:
        proxy = True
        verbose_name = '프록시 유저그룹'
        verbose_name_plural = '프록시 유저그룹'
        ordering = ('first_name', 'username')

 

모델명을 str로 표기할때

class Smodel(models.Model):
    name = models.CharField(max_length=30, verbose_name='S모델 이름')

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = 'S모델'
        verbose_name_plural = 'S모델'
        ordering = ('id',)
 

 

컬럼타입별

from django.core.validators import MinValueValidator, MaxValueValidator
from django.db import models
from django.db.models import Max
from jsonfield import JSONField
import collections
from model_utils.fields import MonitorField, StatusField
from model_utils import Choices
from functools import partial
import uuid


def _update_filename(instance, filename, path):

    from datetime import datetime
    today = datetime.now()
    path = path.replace('%Y', today.strftime('%Y'))
    path = path.replace('%m', today.strftime('%m'))
    path = path.replace('%d', today.strftime('%d'))

    file_ext = filename.split('.')
    file_ext = file_ext[len(file_ext) - 1]

    filename = "{}.{}".format(uuid.uuid4(),file_ext)

    return os.path.join(path, filename)

def upload_to(path):
    return partial(_update_filename, path=path)


STATUS = Choices(
    ('A', 'A단계'),
    ('B', 'B단계'),
    ('C', 'C단게'),
    ('D', 'D단계')
)


name = models.CharField(max_length=30, verbose_name='이름')

# PROTECT, CASCADE, SET_NULL
s_model = models.ForeignKey(Smodel, null=True, on_delete=models.PROTECT, verbose_name='1:N관계') # S모델이 정의되있어야겠죠?

order = models.PositiveIntegerField(verbose_name='순서')

a_model = models.ManyToManyField(Amodel, verbose_name='N:N관계') # A모델이 정의되 있어야겠죠?

b_model = models.OneToOneField(Bmodel, on_delete=models.CASCADE, primary_key=True, verbose_name='1:1관계')

is_boolean = models.BooleanField(default=False, verbose_name='불룬필드', help_text='True False 필드, 저장때는 1,0으로 저장됨')

created_at = models.DateTimeField(auto_now_add=True, verbose_name='생성일')  # auto_now_add는 생성될때 자동으로 추가됨

updated_at = models.DateTimeField(auto_now=True, verbose_name='수정일')   # auto_now는 수정될때 자동으로 추가됨

float_score = models.FloatField(validators=[MinValueValidator(-5.0), MaxValueValidator(5.0)], null=True, blank=True, verbose_name='float 필드')


small_score = models.SmallIntegerField(blank=True, null=True, verbose_name='small integer 필드')

score = models.IntegerField(default=1, verbose_name='integer 필드')

my_text = models.TextField(blank=True, null=True, verbose_name='text필드')

status = StatusField(verbose_name='상태')

status_changed = MonitorField(monitor='status', verbose_name='상태 변경일') # status가 변경될때 자동으로 변경된다

json = JSONField(verbose_name='json 필드', load_kwargs={'object_pairs_hook': collections.OrderedDict}, dump_kwargs={'ensure_ascii': False})

file = models.FileField(upload_to=upload_to('file/%Y/%m/%d/'), verbose_name='file 필드')

email = models.EmailField(null=True, verbose_name='email 필드')

#끝

 

Tag :

Leave Comments