취미삼아 배우는 프로그래밍

Python Django . ERP . 모델을 작성해보자. 본문

파이썬(장고)

Python Django . ERP . 모델을 작성해보자.

Nadure 2019. 10. 15. 21:18

0. Foreign Key의 이해

앞서서. 모델을 잘 모른다. 모델부터 파봐야겠다.

 

일단 DB에 대해 겉핧기 식으로만 알기 때문에

자잘자잘한 부분은 잘 모른다.

 

때문에 어느정도 예제를 숙지해갈 필요가 있다.

 

내가 검색을 하면서 가장 난해하기도 했고, 뭐지,, 싶었던 부분이 바로

 

Foreign Key이다.

 

잘 모르기 때문에, 쓸 수 있을까? 없을까?

너무 애매하다.

 

그래서 Foreign Key를 먼저 써봐야 쓰거나 말거나 할 것 같다.

우선, 사전적으로는 "외부 키"라는 뜻이다.

 

그래. 그럼 이정도면 충분하고

 

일단 먼저 선코딩부터 해봐야겠다.

그냥 해보는게 최우선이다.

 

예제 사이트는 이곳

https://rednooby.tistory.com/88

 

[Django] 장고. model 모델클래스 나눠 관리하기

model클래스를 나누기 전에 Data base의 외부키(foreign key)에 대한 개념이 잡혀있으면 이해하기 쉽습니다. 1. model클래스를 나눠야하는 이유 하나의 DB 테이블이 있습니다. 이렇게 테이블을 만들다보면 후보가..

rednooby.tistory.com

의 것을 해보는걸로.

 

 

내 앱 폴더 안의 models.py 는 아주 별 것 없기 때문에

그냥 여기다가 테스트겸으로 작성한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#models.py 내용 추가.
 
class Candidate(models.Model):
    name = models.CharField(max_length=10)
    introduction = models.TextField()
    area = models.CharField(max_length=15)
    party_number = models.IntegerField(default=0)
 
class Poll(models.Model):
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()
    area = models.CharField(max_length=15)
    
    def __str__(self):
        return self.area
 
class Choice(models.Model):
    poll = models.ForeignKey(Poll, on_delete=models.CASCADE)
    Candidate = models.ForeignKey(Candidate, on_delete=models.CASCADE)
    votes = models.IntegerField(default=0)
 
    def __str__(self):
        return "느낌적인 : " + str(self.poll)
cs

 

 

그리고

 

데이터가 어떤 식으로 흘러가는지 확인코자

어드민에도 등록한다.

1
2
3
4
5
6
7
8
from django.contrib import admin
from modeltest.models import Candidate, Poll,Choice
 
# Register your models here.
 
admin.site.register(Candidate)
admin.site.register(Poll)
admin.site.register(Choice)
cs

 

자 이렇게 하고 데이터를 등록하게 되면 어떻게 보일까?

 

자 이제 Data Migration을 진행하자.

 

python manage.py makemigrations

python manage.py migrate

 

이후 admin 페이지에서 보면..

 

음 아주 잘등록됐다. 현재까진 모두 내 예상대로.!

 

과연 내부 데이터는 어떻게 생겨먹었을까..

 

#Candidate

Candidate. 물론 처음이라 아무것도 없다. Add Candidate를 눌러본다.

#Candidate

#Candidate 어.. 별거없다.

 

#poll

#poll 어.. 마찬가지로 poll도 별거 없다.

 

하지만! Foreign key를 쓴 Choice 라면 뭔가 다르겠지!

 

 

#Choice

#Choice 어.. 어..?

 

이상한 ----+가 앉아있는데..

 

#Choice

오..아.. 그런거구나.. Poll에 있는 데이터를 땡겨오겠다. 뭐 그런거구나. 장하다 요놈.

 

==>> Candidate도 마찬가지.

 

그럼 생각해보자.

이 방식을 내 쪽에도 쓸 수 있는가?

답은 Yes.

 

하나의 데이터에 똑같은 방식의 데이터가 조금씩 다르게 입력이 된다면?

결국 계속 복사하여 같은 것이 반복되게 될터다.

적을 수 없는 데이터도 계속 적어야 할 거고..

 

 

 

이 불편함을 엑셀로 표현했을 때,

데이터 예시

nadure란 놈팽이가 [좋아하는 음식] "하나"를 적기 위해

 

[싫어하는 음식]과 [자주가는 가게]

매 번 적어 주어야 한다는 것.

 

즉, Foreign Key는

이 데이터 테이블을 따로 찢어서 보관할 수 있게 하는 놈이며,

적당히 쓰면 좋다.ㅡㅡㅡㅡ

는게 결론이 된다.

 

 

 

이걸 엑셀로 찢어서 표현하면

이런식으로 되겠다.

 

 

 

이렇게 되면!

누락되는 데이터는 없으며,

싫어하는 음식 하나를 넣기 위해 불필요하게 넣는 데이터 또한 없다.

 

음 생각보다. 상당히 괜찮은 놈이었다.

 

 

그럼 일단 내 데이터 모델을 짜봐야겠다.

 

 

1. 모델 짜기.

대충 이해하기 쉽기 위해

테이블 하나 => 시트 한 개

라고 생각을 하고 짜본다.

 

처음부터 너무 큰 틀을 짜려 하면,

오히려 독이 될 수 있다.

 

내가 듣기에

장고는 확장성 또한 유연하다 들었기 때문에,

 

나름 과감히 중간과정까지만 모델을 기획해봐야겠다.

(장고야 제발 유연해라. 나중에 뻘짓 안하게..)

 

* [생산관리]란 나름 큰 틀에서 보자면 내가 느끼기에

 

[생산] - > [출하]

까지의 과정이다.

이 과정에 있어서 ERP가 없던 구시대에 나름의 관리하는 독창적인 틀들이 존재했었고,

좋은 부분들도 있지만, 나쁜 부분들도 있는 그 잔재 및 문화 등 덕분에

 

여튼 잡일이 많다. (아씨..)

 

물론 틀렸다는건 아니다.

받아들이지 못하도록 하는 시대로 변했을뿐이라 생각한다.

(ex.시대가 어느 때인데..)

 

 

아무튼 엑셀로 대략적인 모델의 개요를 짜보자면,

 

#생산시트

생산 시트

 

#출하시트

출하 시트

 

 

어머나 세상에 맙소사

 

응. 아냐. 이건 빼박 독이다.

모델을 엑셀로만 짯을 뿐인데

벌써 하기 싫어진다.

 

중복되는 부분들은

위에서 확인한

Foreign key를 통해 처리한다 쳐도,

 

 

가장 문제되는 부분은

[기본제품] 부분이다.

 

우리 회사에 기본 제품은

기본적인 틀이되는 제품 옆에 몇 가지를 곁들여서 고객 요청에 맞게 수량을 맞추어 나가는 식이다.

파이썬식으로 표현하면

1
2
3
4
5
6
7
8
9
10
11
12
13
def exmaple(self):
    a_example_one_product = {
        'A물품':{
            '+C과자':50,
            '나트륨':'조금더',
            '당분':'조금더',
        },
        'B물품':{
            'A과자':20,
            '탄수화물':'많이',
            '지방':'무지방',
        }
    }
cs

 

으로 표현된다.

이걸 어떻게 데이터로 표현하면 좋을까?

 

이 내용을 오롯이 Text field(그냥 텍스트)

넣는다면,

들어가기야 들어가고

뷰로도 빼내기야 그냥 빼면 될 것 같긴 하다.

 

하지만 그렇게 되면,

Django의 filter 기능을 못 쓰게 되버린다.

아주 좋은 Query 기능인데..

없으면 조금 복잡해질 것 같다.

여튼 그래서,

 

 

정답은 Custom Field 였다.

 

 

그러다보니 이제는

2. Custom Field 로의 방황.

내가 찾고자 하는건 dict형식으로 표현할 수 있는 필드다.

이를 위해 여럿 검색을 해봤는데,

https://github.com/irothschild/simple-json-text-field/blob/master/fields.py

 

irothschild/simple-json-text-field

A simple JSON TextField for Django models. Contribute to irothschild/simple-json-text-field development by creating an account on GitHub.

github.com

라는 곳에서 어느정도 답을 찾았다.

 

친절히 예시까지 있었다.

 

위의 해당 코드를

[fields.py로 저장] 하고

 

 

모델에

1
2
3
class MyModel(models.Model):
    name = models.CharField(max_length=100null=True, blank=True)
    foobar = SimpleJSONTextField(null=True, blank=True)
cs

 

이렇게 작성한 뒤,

마이그레이트도 해준다.

python manage.py makemigrations

python manage.py migrate

 

 

 

그 뒤,

python manage.py shell

을 통해 쉘에 접속하여 아래 코드를 차근차근 넣어본다.

1
2
3
4
5
6
7
8
9
10
11
12
'''
My Model onthe shell:
'''
 
from modeltest.models import MyModel
mine, created  = MyModel.objects.get_or_create(foobar={"simple""it work!!@"})
 
 
print(mine.foobar['simple'])
'''
 but mine only-> nope!
'''
cs

 

어드민 쪽에서도 확인하는 데이터도 잘 입력되고,

mine.foobar['simple']을 통해 확인되는 데이터도 it works로 잘 나온다.

 

자 이러면 어느정도 재료준비는 끝난것 같다.

모델을 써보려 했는데 모델을 기획만 하고 끝났다.

 

오늘은 이만해야겠다.

Comments