뚝딱쓱삭

Django : Model 정의하기 본문

Web개발/DJANGO

Django : Model 정의하기

별냥이 2020. 5. 29. 14:21
반응형

1. Field생성 시 주요 argument

  •    max_length
  •    help_text : 도움말
  •    verbose_name : UI상에 나오는 이름
  •    default : 기본값
  •    null : True/False
  •    blank : True/False, blank허용여부 (필요시 null=True와 같이 쓰이기도)
  •    choices : 선택가능한 값
  •    primary_key : True일 경우 이 값을 primary key로 만듬

2. Field Type

    docs.djangoproject.com/en/3.0/ref/models/fields/#model-field-types

  •    CharField : 고정길이 문자열. max_length를 반드시 할당해줘야함
  •    TextField : 긴 텍스트
  •    IntegerField : 정수
  •    DateField/DateTimeField : auto_now=True, auto_now_add, default옵션 사용가능
  •    EmailField : 이메일
  •    FileField/ImageField : 파일 및 이미지 업로드 용
  •    AutoField : IntegerField의 auto increment 용
  •    ForeignKey : foreign key 필드, on_delete옵션 사용가능

         - 모델 자신에 foreign key를 걸어야할 때에는

            models.ForeignKey('self', ......)로 처리

  •    ManyToManyField : on_delete옵션 사용가능

2-1. Forieng Key on_delete 옵션값

  •    CASCADE : 해당 모델의 인스턴스도 같이 삭제
  •    PROTECT : 삭제되지 않도록 ProtectedError 발생
  •    SET_NULL : 해당 ForeignKeyField를 Null로 바꿈 (null=True)일 때만 가능
  •    SET_DEFAULT : 미리 정해둔 Default 값으로 할당함
1
test = models.ForeignKeyField(TestModel, on_delete=models.SET_DEFAULT,default=DEFAULT_TEST_MODEL_PK)
cs

출처 : lee-seul.github.io/django/backend/2018/01/28/django-model-on-delete.html

3. Meta Data

   class Meta를 정의하여 모델의 메타데이타를 정의할 수 있음

   예시 :

    ordering = ['title', '-pubdate'] : title과 pubdate기준으로 정렬

4. QuerySet 함수 (레코드 찾아오기)

    https://docs.djangoproject.com/en/3.0/ref/models/querysets/#django.db.models.query.QuerySet.get

  • all()
  • get( 조건 ) : 1개만 가져옴
  • filter( 조건 ) : 조건에 맞는 레코드들을 모두 가져옴
  • exclude( 조건 ) : 조건에 맞는 레코드 제외
  • order_by() : 정렬하여 반환
  • reverse() : 반환된 순서의 역순정렬하여 반환
  • distinct() : SELECT DISTINCT하여 반환
  • values() : model instance대신 dictionary로 반환
  • values_list() : values와 같지만 dictionary가 아니라 tuple로 반환
  • dates() :
  • datetimes()
  • union() : queryset 2개를 SQL UNION하는데 사용
  • intersection() : queryset 2개를 SQL INTERSECT하는데 사용
  • difference() : queryset 2개를 SQL EXCEPT하는데 사용
  • select_related() : foreign key를 따라가서 query (SQL JOIN)
  • prefetch_related() : select_related()와 목적은 비슷하지만 SQL JOIN을 쓰지 않고 2개의 query를 한후 JOIN을 python에서 처리
  • extra() : 정상적인 queryset으로 모든걸 다 담을 수 없을 경우 추가로 사용
  • defer() : 불필요한 필드를 query의 결과에서 제외
  • only() : 특정 필드만 불러옴(defer()의 반대)
  • using() : 복수의 DB사용 시 적용
  • select_for_update() : SELECT ....FOR UPDATE 용도
  • ll_books = Book.objects.all() : 해당 오브젝트 전체를 iterable로 가져옴

    [예시]

  • bestseller = Book.objects.get(title = '슬램덩크') : 1개값만 불러옴, 만일 값이 없으면 DoesNotExist를 띄우고, 여러개면 MultipleObjectsReturned를 띄움
  • comic_books = Book.objects.filter(title__contains='comic') : 제목에 'comic'이 들어간것만 가져옴
  • comic_books = Book.objects.exclude(title__contains='comic') : 제목에 'comic'이 들어간것만 제외
  • comic_books = Book.objects.get(title__contains='comic') : 제목에 'comic'이 들어간것만 제외
  • num_comic_books = comic_books.count() : comic_book의 숫자 반환

 

4-1. filter lookup

  • 사용자에 따라 필터를 걸어야할 경우 

      - 모델명.objects.filter(필드명 = self.request.user) 로 처리

  • Book.objects.filter(title__contains='comic') : title이 'comic'을 포함할 것 (case sensitive)
  • Book.objects.filter(title__icontains='comic') : title이 'comic'을 포함할 것 (case insensitive)
  • Book.objects.filter(title__exact='comic') : title이 'comic'일 것 (case sensitive)
  • Book.objects.filter(title__iexact='comic') : title이 'comic'일 것 (case insensitive)
  • Book.objects.filter(genre__in=['comic', 'SF', 'romantic']) : genre가 'comic', 'SF', 'romatic'중에 포함될것
  • Book.objects.filter(id__gt=4) : id가 4보다 클것
  • Book.objects.filter(id__gte=4) : id가 4이상일것
  • Book.objects.filter(id__lt=4) : id가 4보다 작을것
  • Book.objects.filter(id__lte=4) : id가 4이하일 것
  • Book.objects.filter(title__startswith='slam') : 'slam'으로 시작할 것 (case sensitive)
  • Book.objects.filter(title__istartswith='slam') : 'slam'으로 시작할 것 (case insensitive)
  • Book.objects.filter(title__endswith='dunk')
  • Book.objects.filter(title__iendswith='dunk')
  • Book.objects.filter(date__range=(date1, date2)) : date1과 date2사이의 레코드 반환(SELECT ... BETWEEN ... AND ...)
  • Book.objects.filter(title__isnull=True) : null인값만 반환
  • Book.objects.get(title__regex=r'^(An?|The) +') : regex로 검색(case sensitive)
  • Book.objects.get(title__iregex=r'^(An?|The) +') : regex로 검색(case insensitive)
  • date, year, iso_year, month, day, week, week_day, quarter, time, hour, minute, second : 시간관련 조건

 

    [실 사용례]

    BookInstance.objects.filter(borrower=self.request.user).filter(status__exaxt='o').order_by('due_back')

 

4-1. queryset aggregation

  • Sum()
  • Avg()
  • Count()
  • Max() / Min()
  • StdDev() / Variance()
반응형

'Web개발 > DJANGO' 카테고리의 다른 글

Django : Common Model활용하기  (0) 2020.07.07
Django : Form에서 현재 사용자 확인하기  (0) 2020.07.03
Django 3.x App이름 바꾸기  (0) 2020.06.22
Django REST Framework 간단설정  (0) 2020.06.15
Django Permission  (0) 2020.06.13