I wanted to store a variable list of things in a Django Model. One way to do that is to create another Model, another way is to use a JSON field in your current Django Model. Unfortunately, the default SQLite3 database does not support JSON fields, and you will need to set up a MySQL database.
Install MySQL with Homebrew
I am using a Mac, so I used brew to install MySQL
$ brew install mysql
This should eventually spit out something like
==> Installing mysql ==> Downloading https://homebrew.bintray.com/bottles/mysql-5.7.20.high_sierra.bottle.tar.gz ######################################################################## 100.0% ==> Pouring mysql-5.7.20.high_sierra.bottle.tar.gz ==> /usr/local/Cellar/mysql/5.7.20/bin/mysqld --initialize-insecure --user=connorjohnson --basedir=/usr/local/Cellar/mysql/5.7.20 --datadir=/usr/local/var/mysql --tmpdir=/tmp ==> Caveats We've installed your MySQL database without a root password. To secure it run: mysql_secure_installation MySQL is configured to only allow connections from localhost by default To connect run: mysql -uroot To have launchd start mysql now and restart at login: brew services start mysql Or, if you don't want/need a background service you can just run: mysql.server start
Per the directions, start the service using,
$ brew services start mysql
Create a Database and User
This is part is borrowed from Digital Ocean’s excellent tutorial. Log into the database,
$ mysql -u root
And create a database, a user, and grant that user privileges on that database,
CREATE DATABASE myproject CHARACTER SET UTF8; CREATE USER myprojectuser@localhost IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON myproject.* TO myprojectuser@localhost; FLUSH PRIVILEGES; exit
Install mysqlclient
This might require some debugging. I used this GitHub issue to resolve my problems. I added some environment variables and everything worked out.
export LDFLAGS="-L/usr/local/opt/openssl/lib" export CPPFLAGS="-I/usr/local/opt/openssl/include" pip install mysqlclient
Configure Django to use MySQL
Open the settings.py
file, usually located in project/project/
, and change DATABASES
to the following,
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'myproject', 'USER': 'myprojectuser', 'PASSWORD': 'password', 'HOST': 'localhost', 'PORT': '', } }
Add JSON to Your Models
Change your model to something like the following, note lines 3 and 9.
# models.py from django.db import models from django_mysql.models import JSONField # Create your models here. class Quiz(models.Model): title = models.CharField(max_length=50) description = models.TextField() questions = JSONField() slug = models.SlugField(unique=True) class Meta: verbose_name_plural = "Quizzes"