Vagrant, Amazon Linux2, dbはmysql8系を使います。
$ python3 –version
Python 3.7.9
$ pip3 –version
pip 21.0.1 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
$ pip3 install Django
$ pip3 install PyMySQL
### プロジェクト作成
$ django-admin startproject shoppingcart
$ cd shoppingcart
$ tree
.
├── manage.py
└── shoppingcart
├── __init__.py
├── asgi.py
├── settings.py
├── urls.py
└── wsgi.py
1 directory, 6 files
setting.py
ALLOWED_HOSTS = ["192.168.33.10"]
// 省略
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'shoppingcart',
'USER': 'hoge',
'PASSWORD': 'fuga',
'HOST': 'localhost',
'PORT': '3306',
}
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': BASE_DIR / 'db.sqlite3',
# }
}
mysql> create database shoppingcart;
Query OK, 1 row affected (0.03 sec)
__init__.py
import pymysql pymysql.install_as_MySQLdb()
initpyでimportしないと、mysqlclientをインストールしたかと聞かれるので注意が必要
$ python3 manage.py runserver 192.168.33.10:8000
$ python3 manage.py startapp shop
settings.py
INSTALLED_APPS = [
'shop',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
### テストコード作成
$ pip3 install pytest-django
$ touch pytest.ini
$ rm shop/tests.py
$ mkdir shop/tests
$ touch shop/tests/test_views.py
pytest.ini
[pytest] DJANGO_SETTINGS_MODULE = shoppingcart.settings python_classes = *Test python_functions = test_* python_files = tests.py test_*.py *_tests.py norecursedirs = static templates env
shop/tests/test_views.py
from django.test import TestCase
class ViewTest(TestCase):
def test_first_page(self):
response = self.client.get('/')
assert response.status_code == 200
$ pytest -l -v -s shoppingcart && flake8
============================= test session starts ==============================
platform linux — Python 3.8.5, pytest-6.2.3, py-1.10.0, pluggy-0.13.0 — /usr/bin/python3
cachedir: .pytest_cache
django: settings: shoppingcart.settings (from ini)
rootdir: /home/vagrant/prd/dev/shoppingcart, configfile: pytest.ini
plugins: django-4.2.0
collected 0 items
============================ no tests ran in 0.05s =============================
model
class Category(models.Model):
name = models.CharField(max_length=250, unique=True)
slug = models.SlugField(max_length=250, unique=True)
description = models.ImageField(upload_to='category', blank=True)
class Meta:
ordering = ('name',)
verbose_name = 'category'
verbose_name_plural = 'categories'
def __str__(self):
return '{}'.format(self.name)
$ python3 manage.py makemigrations shop
$ python3 manage.py migrate
class Product(models.Model):
name = models.CharField(max_length=250, unique=True)
slug = models.SlugField(max_length=250, unique=True)
description = models.TextField(blank=True)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
price = models.DecimalField(max_digits=10, decimal_places=2)
image = models.ImageField(upload_to='product', blank=True)
stock = models.IntegerField()
available = models.BooleanField(default=True)
created = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ('name',)
verbose_name = 'product'
verbose_name_plural = 'products'
def __str__(self):
return '{}'.format(self.name)