당신은 멋쟁이, 우리는 장고쟁이~

0%

Models - Fields(Field Name Restrictions)


Field name restrictions


Django 는 모델 필드 이름들에 대한 제약이 있습니다.


  1. 필드명은 파이썬 예약어들이 될수 없습니다. 만약 사용한다면, 파이썬 문법 에러를 발생 시킵니다.


    1
    2
    3
    4
    5
    class Example(models.Model):
    pass = models.IntegerField()

    # pass 는 파이썬에서 reversed word (예약어) 입니다
    # 따라서, 모델의 필드명이 될수 없습니다

  1. 필드명은 하나 이상의 언더스코어를 사용할수 없습니다. Django 의 쿼리 조회문이 언더스코어를 2개 사용하기 때문에, 필드명은, __ 를 가질수 없습니다.

    1
    2
    3
    4
    class Example(models.Model):
    foo__bar = models.IntegerField()

    # foo__bar 는 언더스코어 2개를 가지고 있습니다. 잘못된 필드명입니다.

  1. 비슷한 이유로, 언더스코어로 끝나면 안됩니다. 쿼리 구문과 겹치기 때문입니다

    1
    2
    3
    4
    class Example(models.Model):
    foobar_ = models.InegerField()

    # foobar_ 처럼 언더스코어로 끝나는 필드명은 사용하면 안됩니다.

더 읽어보기 »

파일사이에 모델들


다른 앱에 존재하는 모델끼리 관계를 형성해도 괜찮습니다.

다른 앱에 존재하는 모델을 사용하려면, 관계된 모델을 파일 상단에 가져와서 사용합니다.


다른 모델 클래스를 가져온 다음에는, 필요한곳에 사용하면 됩니다.


공식문서에서는 예시가 많이 빈약한데, 프로젝트 구조가 아래처럼 되어 있다고 가정합니다.


order 라는 앱이 있고, product 라는앱이 있습니다


이런 구조안에서, order/models.py 파일에서, product/models.py 에 있는 모델을

가져다 사용할수 있습니다.


더 읽어보기 »

Models - Relationships (One-to-One)


one-to-one relationships


one-to-one 관계, 즉 1대 1 관계를 정의하기 위해서는,


OneToOneField를 사용해 줍니다. 다른 필드 타입을 사용하는것과 비슷하게, 모델 클래스 안에 클래스 속성으로 정의해 줍니다.


OneToOneField 는 위치 인자를 필요로 합니다.


OneToOneField 는 연결된 모델 클래스를, 필수 위치 인자로 받습니다


예를들어, “places” 라는 데이터베이스를 만들고 있었는데, addressphone number 같이 매우 보편적인 것들을 데이터베이스에 만드려고 하는 상황이 올지 모릅니다.


places 라는 장소위에 restaurant 이라는 데이터베이스를 만들고 싶으면, Place 를 만들때 포함하였던


데이터베이스 필드들을 Restaurant 모델에 반복하여 생성해 주기 보다는,

Restaurant 이 OneToOneField 를 Place 에 갖게 하면 됩니다.


이게 무슨 이야기냐면,,, 하나의 장소 (Place)는 addressphone number 같은 보편적인 정보를 가지고 있을지 모릅니다. 그런데 만약, 하나의 장소 위에 식당 (restaurant) 을 만들고 싶다면?


restaurant 모델을 만들어 줄때에 addressphone number 같은 보편적인 필드들을 다시 정의하지 않고,


Restaurant 이 OneToOneField 를 사용하여 Place 모델과 연결되면 됩니다.


더 읽어보기 »

Django Models - ManyToMany 예시


예시 개요


대학교에서 학생들이 듣는 과정들과 학생들에 대한 모델링을 합니다.


과정은, Course 로 표현하고, 과목들은 아래와 같이 몇개만 정리 합니다.


CourseID CourseName
1 Algorithm Design
2 Systems Programming
3 Object-Oriented Programming

아래 학생들이 재학하고 있다고 가정합니다.


StudentID Name
1 djangojeng-e
2 Jennifer Lawrence
3 Will Smith

학생들은, 여러개의 과목들을 수강할수 있고.

한 과목은 여러명의 수강생들이 들을수 있습니다.


따라서, Students - to - Courses 는 Many-to-Many, 다대다 관계가 성립됩니다


일반적인 Many-to-Many 관계로는, 학생의 수강날짜, 수강종료날짜, 그리고 성적 같은것들을 모두 기록할수 없기 때문에. 중간 모델을 하나 만들어서 관리할수 있습니다.


더 읽어보기 »

Many-to-Many-2편


Many-To-Many 인스턴스들 생성하기


지난 포스팅에서, through 를 사용하여, 중간 모델을 가진 Many-to-Many 관계에 대한 모델을 작성했고.


중간모델 Membership 을 사용하는 ManyToManyField 를 설정하였습니다.


이제 몇가지 many-to-many relationship 을 생성할 준비가 되어 있습니다. 중간 모델의 인스턴스들을 생성하면서 Membership 을 사용하는 Many-to-Many 관계를 생성해 봅시다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Person(models.Model):
name = models.CharField(max_length=128)

def __str__(self):
return self.name

class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')
# through="Membership" 을 넣어줌으로,
# Membership 이 Person 과 Group 사이의 중간 모델 역할을 하게 만들수 있음

def __str__(self):
return self.name


class Membership(models.Model):
# 중간 모델에서는, Person과 Group이 ForeignKey 로 등록 되어 있어야 함
person = models.ForeignKey(Person, on_delete=models.CASCADE)
group = models.ForeignKey(Group, on_delete=models.CASCADE)
date_joined = models.DateField()
invite_reason = models.CharField(max_length=64)

위 모델을 바탕으로, shell 에서 객체를 만들어 봅니다.


shell 에 접속하려면,

python manage.py shell 명령어를 커맨드 라인에서 실행 시키면 됩니다.


더 읽어보기 »

Many-to-many Relationships


many-to-many 관계를 정의하기 위해서는, ManyToManyField 를 사용해 주면 됩니다.


다른 Field 타입을 사용하는것과 비슷하게 사용합니다. 클래스 속성에 포함해주는 방식으로 사용하면 됩니다.


ManyToManyField 는 위치 인자를 필요로 합니다.


관계된 모델을

ManyToManyField 의 위치인자로 넣어주어야 합니다


예를들면, 하나의 피자가 다수의 토핑 객체를 가진다면,


- 토핑은 다수의 피자에 있을수 있고, 각 피자는 다수의 토핑들을 가질수 있습니다.

이러한 관계는 아래의 형태로 표현될수 있습니다.


1
2
3
4
5
6
7
8
9
10
from django.db import models 

class Topping(models.Model):
# ...
pass


class Pizza(models.Model):
# ...
# toppings = models.ManyToManyField(Topping)


더 읽어보기 »

Models - Relationships (Many-to-one)



확실히, 관계형 데이터베이스의 장점은, 테이블들끼리 관계를 생성하는데에서 옵니다.


관계형 데이터베이스란?

데이터베이스계의 주류로,

데이터를 로우 (Row:행, 줄) 과 컬럼 (Column: 열, 칸) 이라는 일종의 표 형태로 저장하고,

데이터의 종속성은 관계 (Relation) 으로 표현한다.

한 테이블에 있는 모든 로우는 같은 길이의 컬럼을 가지고 있으며, 이 컬럼의 구조와 데이터의 관계가 테이블 스키마 (Schema) 로 사전 정의 된다.



Django 는 가장 공통적인 relational database 3가지를 지원합니다.


  • many-to-one (1:M, 1 대 다수)

  • many-to-many (M:M, 다수 대 다수)

  • one-to-one (1:1, 일 대 일 )

더 읽어보기 »

Models - Fields (verbose field names)


ForeignKey, ManyToManyField 그리고 OneToOneField 들을 제외한, 각 필드 타입은 선택적으로 첫번째 위치인자로, verbose name 을 받습니다.


verbose name 이 주어지지 않았을때는, Django 는 자동으로 field 의 속성명의 언더스코어를 공백으로 전환하여 verbose name 을 생성합니다.


verbose name 은

사용자가 사용하는 자세한 이름을 의미합니다


verbose name 을 지정하지 않으면, 어드민에 표시되는 이름이 이상하다는것을 느낄수 있을겁니다.


더 읽어보기 »

Models - Fields(Automatic primary key)


기본값으로, Django 는 각 모델에 다음과 같은 field 를 부여 합니다.

아래 필드는, 해당 모델에 명시적으로 정의해 놓지 않아도, 자동으로 적용이 되어 있습니다.


1
id = models.AutoField(primary_key=True)

이는, 자동으로 증가하는 primary key 입니다.


만약 사용자 정의의 primary key 를 명시하고 싶으면, primary_key 로 사용하고 싶은 필드에, primary_key=True 를 명시해주면 됩니다.


만약, 여러분들이 명시적으로, 어떠한 필드에 primary_key = True 를 설정한것을 보면, django 는 자동으로 id 컬럼을 추가하지 않을것입니다.


각 모델은, 정확히 하나의 필드가 primary_key = True 를 가질것을 요구합니다 (두개 이상의 필드가 primary_key=True 를 가질수는 없다는 이야기 입니다)


Field Options


각각의 필드들은, 해당 필드에 특화된 독립 변수들을 갖습니다.


예를들면,

CharField 와 CharField 의 서브클래스들은,

max_length 같은, 데이터를 저장하기 위해서 길이를 정의하는 독립된 변수들을 갖게 됩니다.


또한, 모든 필드 타입들에 유효한, 공통 독립 변수들도 존재합니다.


모든 변수들은, 선택적으로 사용할수 있고, reference 문서에 완벽하게 설명이 되어 있지만.


가장 공통적으로 많이 사용되는것들을 정리하고 넘어갑니다.


더 읽어보기 »