Model은 데이터 서비스를 제공하는 Layer이다.
Django의 Model은 각 Django App안에 기본적으로 생성되는 models.py 모듈 안에 정의하게 된다.
models.py 모듈 안에 하나 이상의 모델 클래스를 정의할 수 있으며, 하나의 모델 클래스는 데이타베이스에서 하나의 테이블에 해당된다.
class Article(models.Model):
code = models.CharField(max_length=10)
name = models.CharField(max_length=20)
price = models.IntegerField()
pub_date = models.DateTimeField()
이렇게 정의한 모델 class를 물리적인 테이블 생성을 위해
더 구체적으로 정의하기위해 migration한다.
프로젝트를 Make migration하고 선택할 App명을 작성한다.
그후 migrate 한다.
django는 관리자 화면을 지원한다.
프롬프트에서 프로젝트 경로로 이동하고
>python manage.py createsuperuser
아이디와 이메일, 비밀번호를 지정한다.
그 후 localhost/admin으로 접속하여 로그인.
관리자 창에서 CRUD를 하고싶다면 admin.py
에서 정의하면 된다.
admin.py
# admin.ModelAdmin 상속
class ArticleAdmin(admin.ModelAdmin):
#보이고 싶은 내용을 tuple로
list_display = ('id','code','name','price','pub_date')
admin.site.register(Article,ArticleAdmin)
QuerySet
#<QuerySet [<Article: Article object (1)>, <Article: Article object (2)>, <...
django의 select return set은 QuerySet이다.
쿼리셋(QuerySet)은 전달받은 모델의 객체 목록.
쿼리셋은 데이터베이스로부터 데이터를 읽고, 필터를 걸거나 정렬을 할 수 있다.
views , html
#select
def DataShow(request):
datas = Article.objects.all() #ORM으로 select문 수행
return render(request, 'list.html',{'articles':datas})
<body>
{% if articles.count > 0 %}
{% for a in articles %}
<b>{{a.code}}</b> {{a.name}} {{a.price}} {{a.pub_date}}<br>
{% endfor %}
{% else %}
자료가 없습니다
{% endif %}
</body>
1. settings 파일 관련 설정
settings -DATABASES 내용변경
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'guestdb', #DB명 : db는 미리 작성되어 있어야 함.
'USER': 'root',
'PASSWORD': '~~',
'HOST': '127.0.0.21',
'PORT': '3306',
}
}
class Guest(models.Model):
# myno = models.AutoField(auto_created=True,primary_key=True) #자동생성id 대체
title = models.CharField(max_length=50) #varchar 컬럼추가
content = models.TextField()
regdate = models.DateTimeField()
class Meta: # 정렬 Meta정보 삽입가능
ordering = ('-id',) #tuple!
class GuestAdmin(admin.ModelAdmin):
list_display = ('id','title','content','regdate') #컬럼명
admin.site.register(Guest,GuestAdmin)
python manage.py createsuperuser
계정 생성.
admin페이지 로그인 후 CRUD. mariadb와 연동이 완료되었다
remoteDB - insert views.py
- insert요청을 받음
- 요청방식에 의한 분기로 한번에 작성함.
- POST로 받은 form내용을 insert
def InsertFunc(request):
if request.method == 'GET':
return render(request, 'insert.html')
elif request.method == 'POST': #submit
Guest( #DB
title = request.POST.get('title'),
content = request.POST.get('content'),
regdate = datetime.now()
#regdate = timezone.now()
).save()
#get으로 다시 요청해야함. forward X
return HttpResponseRedirect('/guest')
수정,삭제
# 수정 Update
g = Guest.objects.get(id=id번호)
g.title = request.POST.get('title')
g.title = request.POST.get('content')
g.save()
# 삭제 Delete
g = Guest.objects.get(id=id번호)
g.delete()
#where + groupby 조건 filter [where name = '마우스']
print(Article.objects.filter(name='마우스').aggregate(Avg('price')))
# NOT IN
print(Article.objects.exclude(name='마우스').aggregate(Avg('price')))
# distinct
print(Article.objects.values(name='마우스').distinct())
# filter 복수의 값을 반환 (QuerySet)
print(Guest.objects.filter(title__contains='title test2')) #LIKE
print(Guest.objects.filter(title='title test1')) #==
print(Guest.objects.filter(id = 1))
# get 1개만 반환
print(Guest.objects.get(id = 1))
#sort
gdata = Guest.objects.all().order_by('-id','date') # desc / asc 순
# ...
layout.html을 따로 만들어 작성한다.
<div style="color:blue">
{% block content %}
{% endblock %}
</div>
<hr>
바닥글------
대상 html에 block을 추가한다.
<body>
{% extends 'layout.html' %}
{% block content %}
~~내용~~
{% endblock %}
</body>
def List2(request):
products = Product.objects.all()
print(products.values_list())
for row in products.values_list():
print(row)
return render(request, 'list2.html',{'products':products,'pcount':len(products)})