Home > PYTHON > Framework > Django > Django models

Django models
python framework Django

What is model #


Django에서 model은 DB의 구조를 나타내어집니다.

How to use model #


model의 사용법은 다음과 같습니다.

  • <app-name>.models.py 생성
from django.contrib.auth.models import User
from django.db import models

class UserDetail(models.Model):
    user = models.ForeignKey(
        User, verbose_name="user 정보", on_delete=models.DO_NOTHING
    )
    user_email = models.IntegerField(verbose_name="user email", null=False, primary_key=True)
    
    class Meta:
        db_table = "userdetail"
        managed = True
        verbose_name = "user 상세 정보"
        verbose_name_plural = "user 상세 정보 목록"
  • <app-name>.admin.py 추가(case 1)
from django.contrib import admin
from .models import Cart

class CartAdmin(admin.ModelAdmin): # admin 페이지에 표기할 column 지정
    list_display = ('<column-name>', '<column-name>')

admin.site.register(Cart, CartAdmin) # admin page에 등록
  • <app-name>.admin.py 추가(case 2)
from django.contrib import admin
from .models import Cart

@admin.register(Cart) # admin page에 등록
class CartAdmin(admin.ModelAdmin): # admin 페이지에 표기할 column 지정
    list_display = ('<column-name>', '<column-name>')

Field of model #


model의 column들을 정의 하는 field는 다음과 같이 사용할 수 있습니다.

ID Field #


Field 타입 설명
AutoField 1에서 부터 자동적으로 증가합니다.
BigAutoField 1 ~ 9223372036854775807까지 1씩 자동으로 증가하는 필드입니다.
UUIDField UUID 전용 필드입니다.

String Field #


Field 타입 설명
CharField 적은 문자열을 저장하는 필드입니다.
TextField 많은 문자열을 저장하는 필드입니다.
URLField URL을 저장하는 필드입니다.
EmailField E-mail을 저장하는 필드입니다.

String Field #


Field 타입 설명
CharField 적은 문자열을 저장하는 필드입니다.

Data Field #


Field 타입 설명
BinaryField Binary 데이터를 저장하는 필드입니다.
DecimalField Decimal 데이터를 저장하는 필드입니다.
IntegerField Interger 데이터를 저장하는 필드입니다.
PositiveIntegerField 양수만 취급하는 Interger 데이터를 저장하는 필드입니다.
FloatField Float 데이터를 저장하는 필드입니다.
BooleanField 참/거짓 데이터를 저장하는 필드입니다.
NullBooleanField Null값이 가능한 참/거짓을 저장하는 필드입니다.

Time Field #


Field 타입 설명
DateField 날짜 데이터를 저장하는 필드입니다.
TimeField 시간 데이터를 저장하는 필드입니다.
DateTimeField 날짜와 시간 데이터 모두 저장할 수 있는 필드입니다.

File Field #


Field 타입 설명
ImageField 이미지 데이터를 저장하는 필드입니다.
FileField 파일 업로드 데이터를 저장하는 필드입니다.
FilePathField 파일 경로 데이터를 저장하는 필드입니다.

Relation Field #


Field 타입 설명
OneToOneField 일대일 관계를 저장하는 필드입니다.
ForeignKey 일대다 관계를 저장하는 필드입니다.
ManyToManyField 다대다 관계를 저장하는 필드입니다.

더 많은 정보는 다음에 포함되어 있습니다.
relations

Field Option #


Field의 옵션은 다음과 같으며 모든 Field가 모든 옵션을 사용할 수는 없습니다.

Field 옵션 설명 기본값
default 필드의 기본값을 설정합니다. -
help_text 도움말 텍스트를 설정합니다. -
null Null 값 허용 유/무를 설정합니다. False
blank 비어있는 값 허용 유/무를 설정합니다. False
unique 고유 키 유/무를 설정합니다. False
primary_key 기본 키 유/무를 설정합니다. (null=False, unique=True와 동일) False
editable 필드 수정 유/무를 설정합니다. False
max_length 필드의 최대 길이를 설정합니다. -
auto_now 개체가 저장될 때마다 값을 설정합니다. False
auto_now_add 개체가 처음 저장될 때 값을 설정합니다. False
on_delete 개체가 제거될 때의 동작을 설정합니다. -
db_column 데이터베이스의 컬럼의 이름을 설정합니다. -

Meta Option #


Meta 옵션은 다음과 같습니다.

Meta 옵션 설명 기본값
abstract 추상 클래스 유/무를 설정합니다. False
db_table 모델에 사용할 데이터베이스 테이블의 이름을 설정합니다. -
managed 데이터베이스의 생성, 수정, 삭제 등의 권한을 설정합니다. True
ordering 객체를 가져올 때의 정렬 순서를 설정합니다. -
verbose_name 사람이 읽기 쉬운 객체의 이름을 설정합니다. (단수형으로 작성) -
verbose_name_plural 사람이 읽기 쉬운 객체의 이름을 설정합니다. (복수형으로 작성) -

model manager #


model은 기본적으로 objects를 manager로 가지게 되어있습니다. 하지만 아래와 같이 override할 수 있습니다.

class DeletedManager(models.Manager):
    use_for_related_fields = True # default manager로 사용시 관계에서 모두 활용 가능

    def deleted(self, **kwargs):
        return self.filter(is_deleted=False, **kwargs)

    def get_queryset(self):
        return super().get_queryset().filter(is_deleted=False)
class Post(models.Model):
    objects = DeletedManager()

structure of model #


구조는 위에 나열한 Field를 추가하여 주면 되며, Meta를 사용한 abstract기능을 True로 해주면 상속을 할 수 있는 상태가 됩니다. 아래는 default로 있는 User정보의 abstract를 활용한 예시입니다. Mixedin은 2개이상의 상속을 받을때 사용하며, abstract와 같으나 명칭만 다릅니다.

class User(AbstractBaseUser, PermissionsMixin):
    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['nickname', ]

    class Meta:
        ordering = ('-date_joined',)

    def __str__(self): # object 호출시 지정할 명칭
        return self.nickname

migration #


migration은 DB와 코드간의 상태를 확인하는 작업입니다. 아래의 코드는 migration을 하는데 있어 주로 사용되는 코드입니다.

python manage.py showmigrations # migration의 상태확인
python manage.py makemigrations # migration 생성
python manage.py migrate # migration 적용
python manage.py --fake <app-name> zero # <app-name>의 migration 초기화
python manage.py --fake-initial # fake migration 생성