drf 사용한 문법 정리(model)

이종호·2021년 3월 9일
0

Django

목록 보기
4/6
post-thumbnail
from django.db import models							
from django.utils import timezone			


# Create your models here.
class Users(models.Model):							
    created = models.DateTimeField(editable=False)			
    modified = models.DateTimeField()
    login_id = models.CharField(max_length=100, null=False)
    login_pw = models.CharField(max_length=500, null=False)
    showpage = models.IntegerField(default=0)

    class Meta:
        ordering = ['created', 'modified']
        db_table = "User"

    def __str__(self):
        return self.login_id

    def save(self, *args, **kwargs):
        if not self.id:
            self.created = timezone.now()
        self.modified = timezone.now()
        return super(Users, self).save(*args, **kwargs)


class Image(models.Model):
    image_widget = models.ImageField(upload_to='users/images/%Y/%m/%d/', blank=True, null=True)
    user = models.ForeignKey(Users, null=True, on_delete=models.CASCADE)

    class Meta:
        db_table = "Image"


class Screen(models.Model):
    created = models.DateTimeField(editable=False)
    modified = models.DateTimeField()

    body = models.TextField()
    user = models.ForeignKey(Users, null=True, on_delete=models.CASCADE)
    alias = models.CharField(max_length=100)

    class Meta:
        ordering = ['created', 'modified']
        db_table = "Screen"

    def __str__(self):
        return f'[{self.pk}]{self.user.login_id}'

    def save(self, *args, **kwargs):
        if not self.id:
            self.created = timezone.now()
        self.modified = timezone.now()
        return super(Screen, self).save(*args, **kwargs)


class ScreenPage(models.Model):
    user = models.ForeignKey(Users, null=False, on_delete=models.CASCADE, default=models.SET_NULL)
    page_sort = models.TextField(default=models.SET_NULL)

    class Meta:
        db_table = "ScreenPage"

    def __str__(self):
        return f'[{self.user}]{self.user.login_id}'

models.py는 앱을 생성하면 기본으로 제공되는 파일 중 하나이다.
파일에 class로 모델을 생성하고,
$ python manage.py makemigrations
$ python manage.py migrate
를 진행하면 실제 DB에 테이블이 생성된다.

만약 아무런 변화가 없다면 settings.py에 생성한 앱을 등록했는지 확인하자.

make migrations는 변화된 모형을 파일형태로 저장하는 명령어고
migrate는 파일을 실행해 실제 DB를 변경하는 작업이다.

모델에 속성을 추가하는 방법은 구글링하거나 공식문서를 참고하면 좋을 것 같다.

Django Model Fields Reference
한국말 번역 링크

아직 나도 완전하지 못하고 그냥 사용해보는 수준이라 더욱 익혀야 할 것 같다.

DateTimeField(auto_now_add, auto_now)

처음에 이 옵션을 알게되었을때 일어나서 박수를 칠뻔했다.

테이블 속성 중 생성시간과 수정시간을 자동으로 추가해주기 때문이다.
새로 생성되는 created_at은 auto_now_add속성을
updated_at은 auto_now속만만 True로 설정해주면 된다고 햇다.

하지만 실제 모델을 만들고 작동을 시켜보니 값들이 null과 같은 형태가 되었다..

정확한 이유를 찾기 어려웠고 다만 나와같은 사람이 더 있었다는 것을 확인하고 일단 datetime객체를 이용해 저장하는 방식을 취했다.
https://tomining.tistory.com/145
https://intellipaat.com/community/21842/django-autonow-and-autonowadd

created = models.DateTimeField(editable=False)

def save(self, *args, **kwargs):
        if not self.id:
            self.created = timezone.now()
        self.modified = timezone.now()
        return super(Screen, self).save(*args, **kwargs)

조금 더 코드가 더러워 졌지만 기능을 잘 작동하고, 나름 만족하고 있다.

META

class Meta:
        ordering = ['created', 'modified']
        db_table = "User"

Meta는 저장될 db의 메타데이터를 설정하는 곳이다.

  • ordering: 저장될 속성의 순서를 지정한다.

    위에서 ordering은 있으나 마나한 속성같아서 뺴야할 것 같다.

  • db_table: 저장될 DB Table의 이름을 지정한다.
    지정하지 않으면 앞에 앱이름이 붙어 지저분하게 되므로 필요시 경우게 맞게 붙이면 좋을듯 싶다.

str

def __str__(self):
    return f'[{self.pk}]{self.user.login_id}'

admin페이지에서 해당 DB의 값들이 어떻게 보일지 지정한다.

  • admin페이지를 굳이 사용하지 않는다면 사용하지 않아도 된다.
profile
코딩은 해봐야 아는 것

0개의 댓글