7.Django模型与数据库

7.Django模型与数据库

1.简介

Django是自带orm,并且支持市面上大多数数据库,比如sqlite3, MySQL, PostgreSQL等。模型一般写在models.py中。

Django默认使用sqlite3作为数据库。

数据库的配置是在setting.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

ENGINE:可以使用的有

'django.db.backends.sqlite3'
'django.db.backends.postgresql'
'django.db.backends.mysql'
'django.db.backends.oracle'

一般使用sqlite3和mysql比较多,大型项目或许使用oracle,postgresql没有接触过。

NAME: 数据库的名称 我们直接使用默认的。
mysql使用示例:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test', # 数据库名称,
        'HOST': 'localhost', # 主机地址
        'USER': 'user', # 数据库用户
        'PASSWORD': 'pwd', # 密码
        'PORT': 3306 # mysql的端口默认3306
    }
}

注意:除了sqlite数据库,使用其他数据需要自己手动先创建数据库, CREATE DATABASE database_name

我们在models.py 中添加

from django.db import models

class News(models.Model):
    title = models.CharField(max_length=50)
    content = models.CharField()

然后在终端执行

python3 manage.py makemigrations
python3 manage.py migrate

查看sql:

python3 manage.py sqlmigrate news 0001

sqlmigrate命令可以用来显示,数据库的sql,后面跟着的是app名称,和migrations文件下的某个表的版本号。

BEGIN;
--
-- Create model News
--
CREATE TABLE "news_news" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(20) NOT NULL, , "content" text NOT NULL);
COMMIT;

我们使用的Django自带的api操作数据库。

python3 manage.py shell
>>> from news.models import News
>>> News.objects.create(title='今天有雨', content='是的 是的是的')
<News: News object (1)>
>>>

从数据库查询数据

>>> News.objects.get(title='今天有雨')
<News: News object (1)>
>>>

但是我们看到的是默认的数据。我们从新编辑News类。

class News(models.Model):
    title = models.CharField(max_length=50)
    content = models.TextField()

    def __str__(self):
        return self.title

然后输入exit()退出终端,然后按上面步骤在此进入

>>> News.objects.get(title='今天有雨')
<News: 今天有雨>
>>>

2.创建对象

1.News.objects.create(title=title,content=content)
2.n = News(title,content)
n.save()
3.News.objects.get_or_create(title,content)
这个方法返回元祖第一个是News对象,第二个boolean表示是否已经存在

3.查询

1.News.objects.all()
2.News.objects.all()[:3] 切片
3.News.objects.get(title=title)
4.News.objects.filter(title=title)这个是平日使用最多的

3.实战

views.py

from .models import News
def index(request):
    news = News.objects.all()
    return render(request, 'index.html', {'news': news})

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<ul>
    {% for new in news %}
        <ul>
            <div>标题:{{ new.title }} </div>
            <div>内容: {{ new.content }}</div></ul>
    {% endfor %}

</ul>
</body>
</html>

声明:原创文章,版权所有,转载请注明出处,https://litets.com。