본문 바로가기
my_lesson/_Python

Python - Django

by boolean 2019. 6. 19.
728x90

Python - Django

 

Django 설치 [바로가기]

 

Django 의 구조

Project > apps > models > fields
 

모델의 변경을 만드는 세 단계의 지침을 기억하세요.

 
  • (models.py 에서) 모델을 변경하거나 생성합니다.
  • python manage.py makemigrations을 통해 이 변경사항에 대한 마이그레이션을 만드세요.
  • python manage.py migrate 명령을 통해 변경사항을 데이터베이스에 적용하세요.

Django models add null field 

class Person(models.Model):
  name = models.CharField(max_length=255)  # 필수
  bio = models.TextField(max_length=500, blank=True)  # 선택 (null=True를 넣지 말자)
  birth_date = models.DateField(null=True, blank=True)  # 선택 (여기서는 null=True를 넣을 수 있다.)
  is_married = models.BooleanField()
  is_divorced = models.NumBooleanField()
 

Django CRUD

Create
save()
objects.create()
objects.bulk_create()
Rest framework
Read(Select)
해당 테이블 내의 모든 데이터 - objects.all()
해당 테이블 내의 선택 데이터 - ovjects.get()
해당 테이블 내의 조건 데이터 - objects.fillter()
해당 테이블 내의 실제 값 - objects.values()

 

 
Update
save()
objects.filter(field1 = 'value_f1', field2 = 'value_f2', ...), update(**update_dict)
Rest framework
방법1. 각 Model Instance 속성을 변경하고, save 함수를 통해 저장
 
1-1
post_instance = Post.objects.get(id=66)
post_instance.title = 'edit title' # title 수정
post_instance.save()
 
1-2
queryset = Post.objects.all()
for post in queryset:
    post.tags = 'Python, Django'
    post.save() # 각 Model Instance 별로 DB에 update 요청 - 성능저하
 
 
방법2. QuerySet의 update 함수에 업데이트할 속성값을 지정하여 일괄 수정
 
queryset = Post.objects.all()
queryset.update(title='test title') # 일괄 update 요청
 
Delete
objects.delete()
objects.filter(field1 = 'value_f1', field2 = 'value_f2', ...), delete()
 

Django models pprint Dict Type 사전타입 출력

import datetime
from django.db import models
from django.utils import timezone
 
# Create your models here.
class Member(models.Model):
    name = models.CharField(max_length = 20)
    # 이름으로 출력되도록 한다
    def __str__(self):
        return self.name
 
class Question(models.Model):
    question_text = models.CharField(max_length = 200)
    pub_date = models.DateTimeField('date published')
    ## Expression of Ofject
    def __str__(self):
        return self.question_text
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days = 1)
 
class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete = models.CASCADE)
    choice_text = models.CharField(max_length = 200)
    choice_prod = models.CharField(max_length = 200, default=None, blank=True, null=True)
    votes = models.IntegerField(default= 0)
    ## Ecpression of Ofject
    def to_dict(self):
        return {
            'ID': self.id,
            'choice_text':self.choice_text,
            'choice_prod':self.choice_prod,
            'question': {
                'ID':self.question.id,
                'question_text':self.question.question_text,
                'pub_date':self.question.pub_date,
            }
        }
    def __str__(self):
        return self.choice_prod
    def __str__(self):
        return self.choice_text
 
"""
##  사전 타입 출력하기
from assembly.models import Question, Choice
from django.utils import timezone
from pprint import pprint
 
Question.objects.all().delete()
questions = Question.objects.bulk_create(
    [
        Question(
            id = i,
            question_text = 'question-{}'.format(i),
            pub_date = timezone.now(),
        )
        for i in range(1, 10)
    ]
)
 
Choice.objects.all().delete()
Choice.objects.bulk_create(
    [
        Choice(
            id = i,
            choice_text = 'choice-{}'.format(i),
            choice_prod = 'TV-{}'.format(i),
        )
    ]
)
"""
 

Django JOIN

Model 정의
참조하는 pk가 있는 경우 :  question = models.ForeignKey(Question, help_text = '참조키 정의')
참조하는 pk가 없는 경우 :  question = models.ForeignKey(Question, to_field = 'pub_date', db_column = 'test', ....)
JOIN
Choice.objects.select_related('question')  <- InnerJoin
 
 

Django UNION

참조 모델과 피참조 모델 에 동일한 이름의 필드가 존재 하여야 한다.
Choice.objects.all().values_list(
'id'   //{1, 2, 3, 4,,5, 6}
).union(
Question.objects.all().value_list(
'id'   //{4, 5, 6, 7, 8, 9}
))
result = {1, 2, 3, 4, 5, 6, 7, 8, 9}
 

SQLlite3 CRUD

import sqllite3
conn = sqlite3.connect('assembly.db')
 
cursor = conn.cursor()
 
# Create table if not exists...
cursor.excute('CREATE TABLE IF NOT EXISTS member(name text, code text)')
 
# Insert a row of data
members = [('홍길동', '12345'), ('김철수', '12345'), ('이명희', '12345')]
cursor.executemany("INSERT INTO member VALUES (?, ?)", members)
 
# Save (commint) the changes
conn.commit()
 
#Fetch data from Table
for row in cursor.execute('SELECT * FROM member'):
print(row)
 
conn.close()
 
 
 

Django MariaDB(mysql)

 
pip install mysqlclient
myDjango/myDjango.settings.py
...
DATABASES = {
 
    'default': {
        #'ENGINE': 'django.db.backends.sqlite3',
        #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
 
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db-name',  #mysql
        'USER': 'db-user-name', #root
        'PASSWORD': 'db-password', #1234
        'HOST': 'db-adress', #공백으로 냅두면 default localhost
        'PORT': 'port-number' #공백으로 냅두면 default 3306
    }
}
....

python manage.py makemigrations

python manage.py migrate

 

mysql -u user -p db

password:

show tables;

 

Django MariaDB(mysql) 비밀번호 관리

기본 설정은 위와 같지만 소스를 오픈 할경우 중요정보가 공개되어지므로 실제 사용은 아래와 같이 사용 한다.

프로젝트최상위폴더/mysql.ini 를 생성하고 아래와 같이 작성한다.

.gitignore에 mysql.ini를 등록해서 사용한다.

[client] 

database = dbName

user = dbUser

password = dbPassword 

default-character-set = utf8

 

myApp/settings.py

DATABASES = { 

'default': {

 'ENGINE': 'django.db.backends.mysql',

 'OPTIONS': {

     'read_default_file': os.path.join(BASE_DIR, 'mysql.ini'),

'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", #Added set of Strict

},

'PORT': '3306',

 } 

}

 

Django templates

myProject/myApp/urls.py // 없으면 새로 만든다.

from django.urls import path

from . import views

 

urlpatterns = [

path(' ', views.index, name='index'),

]

 

myproject/myProject/urls.py

from django.contrib import admin

from django.urls import path, include

 

from myApp import index

 

urlpatterns = [

path(' ', index.MAIN),

path('admin/', admin.site.urls),

path('myApp/', include('myApp.urls')),

]

 

myProject/myApp/index.py     //  path(' ' , index.MAIN

from django.shotcuts import render

from django.views.generic import ListView

from .models import myModel

 

MAIN = ListView.as_view(model=myModel)

 

myProject/myApp/views.py    // path('myApp/', include('myApp.urls')

from django.http import httpResponse

 

def index(request):

return HttpResponse("Hello , HttpResponse !!")

 

 

반복문  for

숫자 증가 시키기 내장함수 : forloop.counter 1씩 증가

나머지 구하기     내장함수 : divisibleby 

데이터 테이블 형태로 뿌리기

 

<table style="border:1px solid blue;">
<tr>
{% for member in member_list %}
<td>
{{ member }}
{% if forloop.counter|divisibleby:10 %}
</td></tr><tr>
{% else %}
</td>
{% endif %}
{% endfor %}
</tr>
</table>

 

python django form control (폼 다루기)

myapp/templates/main.html

 

<form action="submit" method="post">

    <input type="text" name="info"><br>

    <input type="submit" value="Submit">

</form>

 

myapp/urls.py

 

url(r'^submit', views.submit)

 

myapp/views.py

 

def submit(request):

    info=request.POST['info']

    # do something with info

 

댓글