Django model
Tags: python, django, webdev
Published: 2020-03-04 22:12:23

Django supports a variety of databases, including PostgreSQL, MySQL, SQLite, Oracle.

Django provides a unified call API for these databases. We can choose different databases based on our own business needs.

MySQL is the most commonly used database in web applications. We'll cover Mysql as an example in this section. You can learn more about the basics of Mysql in <a href="https://pythonspot.com/mysql-with-python/">this site</a>.

If you don't have mysql driver installed, you can perform the following command installation:

```
sudo pip install mysqlclient
```

If you are new to Django, this is a good <a href="https://gumroad.com/l/Qcmns">Django course</a>

## Database configuration

We set the DATABASES configuration in the project's settings.py file and changed its information to:

```
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'test',
        'PASSWORD': '****yourpassword****',
        'HOST':'localhost',
        'PORT':'3306',
    }
}
```

It contains database names and user information, which are the same as the corresponding database and user settings in MySQL. Based on this setting, Django connects to the appropriate databases and users in MySQL.

## Defining a model

Django states that if you want to use a model, you must create an app. We use the following command to create an app for TestModel:

    python manage.py startapp TestModel

The directory structure is as follows:

```
HelloWorld
|-- TestModel
|   |-- __init__.py
|   |-- admin.py
|   |-- models.py
|   |-- tests.py
|   `-- views.py
```

We modify the TestModel/models.py file with the following code:

`HelloWorld/TestModel/models.py`: file code:

```python
# models.py
from django.db import models

class Test(models.Model):
    name = models.CharField(max_length=20)
```

The above classes represent the database name and inherit models. Model, the fields inside the <a href="https://pythonbasics.org/class/">class</a> represent the fields in the data table (name), and the data types are defined by CharField (equivalent to varchar) and the max_length parameters.

Next, find this INSTALLED_APPS in settings.py, as follows:

```python
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'TestModel',
)
```
Run on the command line:

Note: In Django 1.9 and future versions use migrate instead of syscdb.

```
$ python manage.py migrate
$ python manage.py makemigrations TestModel
$ python manage.py migrate TestModel
```

You'll be able to create your data sheet with a few lines of the words "Creative table...".

    Creating tables ...
    …… 
    Creating table TestModel_test
    ……

The table name is composed of: app name, class name (e.g., TestModel_test).

**Note:** Although we didn't set the primary key to the table in models, Django automatically adds an id as the primary key.

## Database operations

Next, we add testdb.py files in the HelloWorld directory and modify urls.py:

```python
from django.conf.urls import *
from HelloWorld.view import hello
from HelloWorld.testdb import testdb

urlpatterns = patterns("",
        ('^hello/$', hello),
        ('^testdb/$', testdb),
)
```

### Add data
Adding data requires creating an object before executing the save function, which is equivalent to INSERT in SQL:

```python
from django.http import HttpResponse
from TestModel.models import Test

def testdb(request):
  test1 = Test(name='dev.to')
  test1.save()
  return HttpResponse("<p>saved</p>")
```

Visit /testdb/ you can see a hint of success in adding data. If you want you can verify this in the MySQL database table.

### Get data

Django provides a variety of ways to get the contents of the database, as shown in the following code:

HelloWorld/HelloWorld/testdb.py: File code:

```python
from django.http import HttpResponse
from TestModel.models import Test

def testdb(request):
    response = ""
    response1 = ""

    # Get all the data the all() method, this is equivalent to SELECT * in SQL.  
    list = Test.objects.all()

    # Filter is equivalent to WHERE in SQL
    response2 = Test.objects.filter(id=1) 

    # Get a single object
    response3 = Test.objects.get(id=1) 

    # Limit returned data equivalent to OFFSET 0 LIMIT 2 in SQL
    Test.objects.order_by('name')[0:2]
    Test.objects.order_by("id")
    Test.objects.filter(name="dev.to").order_by("id")

    # Output all data
    for var in list:
        response1 += var.name + " "

    response = response1
    return HttpResponse("<p>" + response + "</p>")
```

### Update data

Modifying data can be made using save() or update():

HelloWorld/HelloWorld/testdb.py: File code:

```python
from django.http import HttpResponse

from TestModel.models import Test

def testdb(request):
    # equivalent to UPDATE in SQL
    test1 = Test.objects.get(id=1)
    test1.name = 'dev.to'
    test1.save()
  
    # Another way
    #Test.objects.filter(id=1).update(name='dev.to')
 
    # Modify all columns
    # Test.objects.all().update(name='dev.to')
   
    return HttpResponse("<p>Updated</p>")
```

### Delete data

Simply call the delete() method of the object in the database by deleting it:

HelloWorld/HelloWorld/testdb.py: File code:

```python
from django.http import HttpResponse

from TestModel.models import Test

def testdb(request):
    # Delete data where id=1
    test1 = Test.objects.get(id=1)
    test1.delete()
    
    # Another way
    # Test.objects.filter(id=1).delete()
  
    # Delete all data
    # Test.objects.all().delete()
 
    return HttpResponse("<p>Deleted</p>")
```