django基础+django操作数据库

1.创建django项目

1. 在终端
django-admin startproject 项目名称        即可创建出一个项目(一个文件夹)
2. 在pycharm终端中创建一个app(需要进入到工程的目录下才可以执行manage.py文件)
python manage.py startapp app的名称      
3. 在工程中的settings.py文件中将创建的app文件夹下的apps.py文件中的那个类进行注册
4. 启动项目
python manage.py runserver
# 注意:from导入时  格式为  from 文件夹.文件夹 import python文件,
# 注意必须保证文件夹下__init__.py 文件才能用. 把东西点出来


# 注意:在进行操作之前,要先将在settings.py中设置连接的数据库
5. 对数据库修改进行迁移,makemigrations可以将自己在models.py中写的那些类的信息,写入到migrations文件夹里面去
python manage.py makemigrations  
# 然后,migrate就是将migrations文件夹中的信息更新,写到数据库中,即:将数据表创建到数据库中
python manage.py migrate
6. 创建管理员
python manage.py createsuperuser 来创建超级用户
7.然后自己设置数据库的字段,创建的在models.py中创建的每一个类都是一个数据表,当某一个类在model.py中创建完成后,需要到admin.py中注册这个类
admin.site.register(数据表类名)

2.关于settings.py

# 1.INSTALLED_APPS 中需要将每次我们创建的app注册到这里

# 2.DATABASES 里面需要对连接的数据库进行配置

# 3.对语言进行修改:LANGUAGE_CODE = 'zh-Hans'

# 4.对时区进行修改:TIME_ZONE = 'Aisa/Shanghai'

# 5.BASE_DIR = Path(__file__).resolve().parent.parent  
# BASE_DIR 表示的是当前工程的路径


# 6.TEMPLATES 里面的 'DIRS'这一项写上路径:
        'DIRS': [os.path.join(BASE_DIR, 'templates')], 指定了找模板时的路径
    
# 7.STATIC_URL = 'static/'  表示的是当访问的是url是static时,就匹配静态的资源
# 然后,添加一项:STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'),] 表示当用户访问static的路由的时候,服务器会到对应的工程的目录下的static目录找资源


3.数据库操作

一个django项目对应一个数据库,需要先在命令行中创建数据库

1.首先需要启动mysql
net start mysql57
2.连接mysql
mysql -u root -p
3.创建数据库
create database mygame default charset=utf8; 
4.进入数据库
use mygame;
5.查看当前数据库的所有数据表
show tables;

在创建了数据库之后,在django项目中settings.py中修改配置

ps:注意,必须要在原先的项目下创建一个app才可以使用数据库

  • 创建项目:django-admin startproject HelloWorld
  • 创建app:django-admin startapp TestModel (而且创建完app后,需要将app注册到settings中)
'default':
    {
        'ENGINE': 'django.db.backends.mysql',  # 数据库引擎
        'NAME': 'mygame',  # 数据库名称
        'HOST': '127.0.0.1',  # 数据库地址,本机 ip 地址 127.0.0.1
        'PORT': 3306,  # 端口
        'USER': 'root',  # 数据库用户名
        'PASSWORD': 'Sz123456',  # 数据库密码
    }

此外,还需要告诉 Django 使用 pymysql 模块连接 mysql 数据库

# 在工程目录与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置
import pymysql
pymysql.install_as_MySQLdb()

注意:

  1. 表名组成结构为:应用名_类名。
  2. 尽管我们没有在 models 给表设置主键,但是 Django 会自动添加一个 id 作为主键。

4.路由分发

Django 项目里多个app目录共用一个 urls 容易造成混淆,后期维护也不方便。

解决:使用路由分发(include),让每个app目录都单独拥有自己的 urls。

步骤:

  • 1、在每个 app 目录里都创建一个 urls.py 文件。
  • 2、在项目名称目录下的 urls 文件里,统一将路径分发给各个 app 目录。

在总urls.py文件中

from django.contrib import admin
from django.urls import path,include # 从 django.urls 引入 include
urlpatterns = [
    path('admin/', admin.site.urls),
    path("app01/", include("app01.urls")),
    path("app02/", include("app02.urls")),
]

5.管理员页面

为了让 admin 界面管理某个数据模型,我们需要先注册该数据模型到 admin。比如,我们之前在 TestModel 中已经创建了模型 Test 。修改 TestModel/admin.py: 在注册完之后,就可以在管理员的页面中看到自己写的数据表了!

from django.contrib import admin
from TestModel.models import Test
 
# Register your models here.
admin.site.register(Test)  # 将数据表注册到管理员页面中
# 只有将自己写的models在admin.py中进行注册之后,在管理员的页面中才能够看到自己创建的对应的表
# 注意:如果说不在admin.py中进行注册的话,那么如果自己定义了类,然后makemigrations,migrate也是能够创建数据表的,只不过数据表就不能在django中的管理员的页面进行查看了

6.django操作数据库

6.1添加数据

增加数据有两种方法。

1)save

通过创建模型类对象,执行对象的save()方法保存到数据库中。
ps:BookInfo是我们自己在models.py文件中定义的类

>>> from book.models import BookInfo,PeopleInfo
>>> book = BookInfo(
...         name='python入门',
...         pub_date='2010-1-1'
...     )
>>> book.save()
>>> book
<BookInfo: python入门>

2)create

通过模型类.objects.create()保存。

>>> PeopleInfo.objects.create(
...         name='zby',
...         book=book
...     )
<PeopleInfo: zby>

6.2修改

修改更新有两种方法

1)save

修改模型类对象的属性,然后执行save()方法

>>> person = PeopleInfo.objects.get(name='zby')
>>> person.name = 'zby'
>>> person.save()
>>> person
<PeopleInfo: zby>

2)update

使用模型类.objects.filter().update(),会返回受影响的行数

>>> PeopleInfo.objects.filter(name='zby').update(name='郑by')
1

6.3删除

删除有两种方法

1)模型类对象delete

>>> person = PeopleInfo.objects.get(name='zby')
>>> person.delete()
(1, {'book.PeopleInfo': 1})

2)模型类.objects.filter().delete()

>>> BookInfo.objects.filter(name='python入门').delete()
(1, {'book.BookInfo': 1, 'book.PeopleInfo': 0})

6.4基础条件查询

6.4.1基本查询
get查询单一结果,如果不存在会抛出模型类.DoesNotExist异常。	
all查询多个结果。
count查询结果数量。
>>> BookInfo.objects.get(id=1)
<BookInfo: 射雕英雄传>
>>> BookInfo.objects.all()
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>, <BookInfo: 雪山飞狐>]>

>>> BookInfo.objects.count()
4
6.4.2过滤查询

实现SQL中的where功能,包括

filter过滤出多个结果
exclude排除掉符合条件剩下的结果
get过滤单一结果
对于过滤条件的使用,上述三个方法相同,故仅以filter进行示例。

1)相等

exact:表示判等。

例:查询编号为1的图书。

BookInfo.objects.filter(id__exact=1)
可简写为:
BookInfo.objects.filter(id=1)

2)模糊查询

contains:是否包含。
例:查询书名包含’传’的图书。

BookInfo.objects.filter(name__contains='传')
<QuerySet [<BookInfo: 射雕英雄传>]>

startswith、endswith:以指定值开头或结尾。

例:查询书名以’部’结尾的图书

>>> BookInfo.objects.filter(name__endswith='部')
<QuerySet [<BookInfo: 天龙八部>]>

3) 空查询
isnull:是否为null。

例:查询书名为空的图书。

>>> BookInfo.objects.filter(name__isnull=True)
<QuerySet []>

4) 范围查询
in:是否包含在范围内。

例:查询编号为1或3或5的图书

>>> BookInfo.objects.filter(id__in=[1,3,5])
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 笑傲江湖>]>

5)比较查询
gt大于 (greater then)
gte大于等于 (greater then equal)
lt小于 (less then)
lte小于等于 (less then equal)

例:查询编号大于3的图书

BookInfo.objects.filter(id__gt=3)

不等于的运算符,使用exclude()过滤器。

例:查询编号不等于3的图书

>>> BookInfo.objects.exclude(id__exact=3)
<QuerySet [<BookInfo: 雪山飞狐>]>

6)日期查询
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。

例:查询1980年发表的图书。

>>> BookInfo.objects.filter(pub_date__year=1980)
<QuerySet [<BookInfo: 射雕英雄传>]>

例:查询1990年1月1日后发表的图书。

>>> BookInfo.objects.filter(pub_date__gt='1990-1-1')
<QuerySet [<BookInfo: 笑傲江湖>]>

1. models.py

1.1 字段的类型以及属性

1.1.1 CharField

CharField(字符型字段)
max_length: 字符串最大长度,默认为255
blank: 是否可以为空,默认为False
default: 默认值

class Person(models.Model):
    name = models.CharField(max_length=50)
    email = models.CharField(max_length=100, blank=True)
    phone_number = models.CharField(max_length=20, default='000-0000-0000')

1.1.2 TextField

TextField(文本字段)
blank: 是否可以为空,默认为False
default: 默认值

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField(blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

1.1.3 IntegerField

IntegerField(整型字段)
blank: 是否可以为空,默认为False
default: 默认值

class Person(models.Model):
    age = models.IntegerField(blank=True, default=0)
    weight = models.IntegerField(blank=True, default=0)

1.1.4 FloatField

FloatField(浮点型字段)
blank: 是否可以为空,默认为False
default: 默认值

class Book(models.Model):
    price = models.FloatField(blank=True, default=0.0)
    rating = models.FloatField(blank=True, default=0.0)

1.1.5 BooleanField

BooleanField(布尔型字段)
default: 默认值

class User(models.Model):
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

增加记录:

# 创建一个新用户,默认is_active为True,is_admin为False
new_user = User.objects.create()

手动指定is_active和is_admin字段的值,则需要在创建对象时传递相应的参数

# 创建一个新用户,指定is_active为False,is_admin为True
new_user = User.objects.create(is_active=False, is_admin=True)

BooleanField字段的值只能为True或False,因此在创建记录时传递的参数也必须是布尔类型的。

1.1.6 DateTimeField

DateTimeField(日期时间字段)
auto_now: 每次保存时,自动将字段更新为当前时间
auto_now_add: 当对象第一次被创建时,自动将字段设置为当前时间
default: 默认值

class Event(models.Model):
    name = models.CharField(max_length=50)
    date_time = models.DateTimeField()

添加数据:

event = Event(name='Birthday Party', date_time=datetime.now())
event.save()

注意:
DateTimeField 字段可以存储以下类型的数据:

1.Python datetime.datetime 对象
2.字符串,格式为 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],其中 TZ 是可选的时区表示,例如:+05:00 或 -0300
3.整数时间戳(timestamp),表示自 1970 年 1 月 1 日 UTC 时间的秒数,例如:1479496800

1.1.7 ForeignKey

ForeignKey(外键字段)
to: 目标模型的名称
on_delete: 删除关联数据时的行为

class Author(models.Model):
    name = models.CharField(max_length=50)

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

在上面的模型中,Book模型通过外键关联到Author模型。添加related_name属性后,可以让Author模型也能访问Book模型,可以通过指定的related_name属性来访问。

例如,我们可以将related_name设置为books,这样在Author模型中可以通过books访问到该作者写的所有书籍。

class Author(models.Model):
    name = models.CharField(max_length=50)

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books')

现在我们可以通过以下代码来访问Author模型中的所有书籍:

author = Author.objects.get(id=1)
books = author.books.all()

在上述的ForeignKey字段中,on_delete是一个必选参数,它指定了当与该字段关联的记录被删除(在这里即指的是与)时,应该采取什么操作。

on_delete可以有以下几种选项:

models.CASCADE:级联删除,也就是删除与之关联的所有记录。
models.PROTECT:保护模式,也就是阻止删除与之关联的记录。
models.SET_NULL:将与之关联的记录的外键字段设置为null。
models.SET_DEFAULT:将与之关联的记录的外键字段设置为默认值。
models.SET():将与之关联的记录的外键字段设置为给定的值。
models.DO_NOTHING:什么也不做,只是删除关联,不会对外键进行任何修改。

例如,我们在Book模型中指定on_delete=models.CASCADE,则当删除与该书籍相关的作者记录时,与之关联的所有书籍记录也会被删除。

注意ForeignKey关联其他的那个表,在数据表中其实存储的是当前对象关联到的其他表中的那个对象的id号!

1.1.8 UrlField

UrlField是Django模型中的一种字段类型,用于存储URL地址。它可以存储任何符合URL格式的字符串,例如网站链接、图片链接等。在数据库中,它被存储为VARCHAR类型。

例如,以下代码定义了一个包含UrlField字段的模型:

class MyModel(models.Model):
    name = models.CharField(max_length=50)
    url = models.URLField()

在实例化该模型时,可以将一个URL字符串传递给url字段:

obj = MyModel(name='Example', url='https://www.example.com')
obj.save()

这将创建一个名为Example的对象,并将https://www.example.com存储在url字段中。

1.1.9 unique属性

如果模型类中的字段设置了unique=True,那么添加已经存在的数据会抛出django.db.utils.IntegrityError异常,表示插入数据违反了唯一性约束。因为在数据库中已经存在了相同的值,不能再插入相同的值。如果想要避免这种情况发生,可以在插入数据前先检查是否已经存在。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值