ํ์ฌ ๋ธ๋๋๊ด์ NEW ๋ธ๋๋ ์ต์ผ๋ก ๋ธ๋๋ ๋ง๋ค ๋ณ๋ ์ด์ํ๊ณ ์ถ์ ํ์ ์ ๋์ฆ๊ฐ ์์. Django & Vue.js๋ฅผ ํตํด ์ด๋์ ๋ ๋น ๋ฅด๊ฒ ํ์ ์ ์ ๊ณตํ ์ ์๋์ง ํ๋กํ ํ์ ๊ตฌํ์ ํตํด ํ์ .
newbrandshop(project)
โโโ client(vue)
โย ย โโโ public
โย ย โโโ src
โโโ server(django)
โโโ config
โโโ item(app)
โโโ magazine(app)
โโโ styleshare(app)
โโโ user(app)
- ํ๋ก์ ํธ ๊ธฐ๊ฐ : 2019.09.23 ~ 2019.11.22
$ pip install -r server/requirements/development.txt
$ pip install -r server/requirements/production.txt
pip ๋ฅผ ์ด์ฉํด์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ ๊ฒ์ด๋ค. ์ด๋ pip๊ฐ ์ค์น๋์ด ์์ง ์๋ค๋ฉด, ์๋ ๋งํฌ๋ฅผ ์ฐธ์กฐํด ํ๊ฒฝ ์ค์ ์ด ํ์ํ๋ค.
๐ Install pip package manager and virtualenv package
๐จ node.js ํจํค์ง๊ฐ ์ค์น๋์ด ์์ด์ผํ๋ค. (๐ Install package of node.js)
ํ๋ก์ ํธ๋ฅผ ์คํํ๊ธฐ ์ ์, npm์ ์ด์ฉํด ํ์ํ ํจํค์ง๋ฅผ ์ค์นํด์ผํ๋ค.
new-brand-shop/client $ npm install vue์์ธํ ์ค๋ช ์ ํ๋จ์ ์ถ๊ฐํ์ต๋๋ค.
ํ๋ก์ ํธ์ ์์ฑ๋์ด ์๋ ๋ชจ๋ธ์ Migration ํด์ค๋ค.
new-brand-shop $ cd servernew-brand-shop/server $ python ./manage.py makemigrationsnew-brand-shop/server $ python ./manage.py migrate๋ง์ด๊ทธ๋ ์ด์ ํ์๋ ๊ธฐ์กด์ ์์ฑํด๋ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ธ์ ์ถ๊ฐํด์ค๋ค. (๋ก์ปฌ ํ ์คํธ์ฉ)
new-brand-shop/server $ python ./manage.py loaddata user/fixtures/data.json
new-brand-shop/server $ python ./manage.py loaddata item/fixtures/data.json
new-brand-shop/server $ python ./manage.py loaddata styleshare/fixtures/data.json
new-brand-shop/server $ python ./manage.py loaddata magazine/fixtures/data.json์ค๋น๊ฐ ๋ค ๋์๋ค๋ฉด, ๊ฐ๊ฐ ์๋ฒ๋ฅผ ์คํ์์ผ์ค๋ค.
$ cd server
$ python manage.py runserver$ cd client
$ npm update
$ npm run servehttp://local-display.cjmall.com:8000/admin/๋ก ์ฅ๊ณ ์ด๋๋ฏผ ํ์ด์ง์ ์ ์ํ ์ ์๋ค.
- id : admin@example.com
- password :admin
http://local-display.cjmall.com:8000/
ํ์ฌ styleshare์์ ๋ด ์คํ์ผ ๊ณต์ ํ๊ธฐ ๋ถ๋ถ์ ์ด๋๋ฏผ ํ์ด์ง ๋ก๊ทธ์ธํ ํ์ ๋ฑ๋กํ ์ ์๋ค.
Debug๊ฐ ํ๊ณ ์ถ์ ์ฝ๋ ๋ถ๋ถ์ pdb.set_trace()๋ฅผ ์ ๋ ฅํด ๋๋ฒ๊น ํ ์ ์๋ค.
import pdb; pdb.set_trace()์ถ๊ฐ์ ์ผ๋ก app์ ๋ง๋ค๊ณ ์ถ์ ๊ฒฝ์ฐ์๋ startapp ๋ช
๋ น์ด๋ก ์์ฑํ ์ ์๋ค.
$ django-admin startapp <app_name>config/settings/base.pyํ์ผ์INSTALLED_APPS๋ถ๋ถ์ ์๋ก ์์ฑํ App Config๋ฅผ ์ถ๊ฐํด์ค๋ค.
INSTALLED_APPS = [
...
# project apps
'magazine.apps.MagazineConfig',
'styleshare.apps.StyleshareConfig',
'item.apps.ItemConfig',
'user.apps.UserConfig',
# your app config
]ํ
์ด๋ธ์ ๊ฐ ์ฑ ๋ด๋ถ์ models.py ํ์ผ์์ ์์ฑ/์์ ํ ์ ์๋ค.
# app/models.py
from django.db import models
class ModelName(models.Model):
title = models.CharField("์ ๋ชฉ", max_length=100)
content = models.TextField("๋ด์ฉ")
created_at = models.DateTimeField("๋ฑ๋ก์ผ", auto_now_add=True)
# fieldname = models.FieldType("comment", **validate)$ python ./manage.py makemigrationsmakemigrations ๋ก database migrate๋ฅผ ํ ์ ์์ผ๋ฉฐ, ๋ง์ฝ ํด๋น SQL๋ฌธ์ ๋ณด๊ณ ์ถ์ ๊ฒฝ์ฐ์๋ sqlmigrate ๋ช
๋ น์ด๋ก ํ์ธํ ์ ์๋ค.
$ python ./manage.py sqlmigrate <app_name> <migration_number>
$ python ./manage.py sqlmigrate item 0001BEGIN;
--
-- Create model Post
--
CREATE TABLE "appname_modelname" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(100) NOT NULL, "content" text NOT NULL, "created_at" datetime NOT NULL);
COMMIT;makemigrations ํ์๋ migrate ๋ช
๋ น์ด๋ก ํ์ ์ง์ด์ค์ผํ๋ค.
$ python ./manage.py migrateManager.raw() ๋ฅผ ์ด์ฉํด์ ORM์ด ์๋ SQL๋ฌธ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค. (Performing raw SQL queries)
first_person = Person.objects.raw('SELECT * FROM myapp_person')[0]def ModelManager(models.Manager):
def with_counts(self):
from django.db import connection
with connection.cursor() as cursor:
cursor.execute("""
SELECT p.id, p.question, p.poll_date, COUNT(*)
FROM polls_opinionpoll p, polls_response r
WHERE p.id = r.poll_id
GROUP BY p.id, p.question, p.poll_date
ORDER BY p.poll_date DESC""")
result_list = []
for row in cursor.fetchall():
p = self.model(id=row[0], question=row[1], poll_date=row[2])
p.num_responses = row[3]
result_list.append(p)
return result_listDjango ORM์ Queryset์ ํด๋นํ๋ SQL ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ ค๋ฉด ๊ฐ QuerySet ๊ฐ์ฒด๋ ๋๋ฒ๊น ์ ์ํด stdout์ ๋ก๊ทธ๋ ์ถ๋ ฅํ ์ ์๋ ์์ฑ์ ๊ฐ์ง๊ณ ์๋ค.
qs = Model.objects.filter(name='test')
print(qs.query)๋ง์ฝ์ ์๋์ผ๋ก ์ฑ์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ณ ์ถ์ ๊ฒฝ์ฐ์๋ manage.py loaddata <fixtures> ๋ฅผ ์ฌ์ฉํ๋ฉด๋๋ค.
$ python ./manage.py loaddata user/fixtures/data.json
$ python ./manage.py loaddata item/fixtures/data.json
$ python ./manage.py loaddata styleshare/fixtures/data.json
$ python ./manage.py loaddata magazie/fixtures/data.json๋ํ, ๋ฐ์ดํฐ์ ํ ์ด๋ธ์ ๋ค์ ๋ช ๋ น์ด๋ก ์ญ์ ํ ์ ์๋ค.
$ find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
$ find . -path "*/migrations/*.pyc" -delete
$ rm -rf config/db.sqlite3dumpdata๋ ํด๋น ์ฑ์ ์๋ ๋ฐ์ดํฐ๋ฅผ json ํ์ผ๋ก ์์ฑํ๋ ๋ฐฉ๋ฒ์ด๋ค.
$ python manage.py dumpdata <app_name>.<model> --indenet 4 > file.json$ ./manage.py dumpdata user.User --indent 4 > user/fixtures/data.json
$ ./manage.py dumpdata item.Item --indent 4 > item/fixtures/data.json
$ ./manage.py dumpdata magazine.Magazine --indent 4 > magazine/fixtures/data.json
$ ./manage.py dumpdata styleshare.StyleShare --indent 4 > styleshare/fixtures/data.json