Django学习笔记(4)


一、什么是模型

在计算机科学中,模型是对现实世界或某个问题领域的抽象表示。它是对实体、属性、关系和行为的描述,用于帮助我们理解和解决问题,而在web开发中,常见的模型是数据库模型。数据库模型用于描述数据表、列和表之间的关系,它们通常由ORM(对象关系映射)工具生成,并与数据库进行交互。并且除了数据库模型,还有其他类型的模型,如数学模型、机器学习模型、图形模型等。这些模型用于表示和解决不同领域的问题,如数学模型用于描述数学关系,机器学习模型用于训练和预测数据等。在这里就不谈其他模型,在Django中,模型是由ORM(对象关系映射)工具生成的,它提供了一种将对象和数据库之间进行映射的方式。通过定义模型类,我们可以使用Python代码来描述数据库表、字段和关联关系,而不需要直接编写SQL语句。

二、常用的字段类型

下列就是一些常用的字段类型:

CharField:用于存储字符串数据,可以指定最大长度。

IntegerField:用于存储整数数据。

FloatField:用于存储浮点数数据。

DecimalField:用于存储十进制数,可以指定最大位数和小数位数。

BooleanField:用于存储布尔值(True或False)。

DateField:用于存储日期。

DateTimeField:用于存储日期和时间。

TimeField:用于存储时间。

TextField:用于存储长文本数据。

EmailField:用于存储电子邮件地址。

URLField:用于存储URL。

FileField:用于存储上传的文件。

ImageField:用于存储上传的图片文件。

ForeignKey:用于定义一对多关系,即一个模型实例与另一个模型实例之间的关系。

ManyToManyField:用于定义多对多关系,即一个模型实例可以与多个其他模型实例相关联。

三、模型字段选项

模型字段选项是用于在定义Django模型的字段时,为字段提供额外的配置和行为的参数。模型字段选项以关键字参数的形式传递给字段的构造函数,用于定义字段的各种特性,如是否允许为空、是否唯一、默认值等。下列是一些常用的模型字段选项:

blank=True:表示字段在表单验证时允许为空。与null=True不同,blank=True是在应用程序级别进行验证,而不是在数据库层面。

default:指定字段的默认值。

choices:定义字段的可选值列表。

verbose_name:设置字段的人类可读名称。

unique:指示字段值是否必须唯一。

help_text:提供有关字段的帮助信息。

db_index:指示数据库是否为该字段创建索引。

max_length:设置最大长度

primary_key=True:是否设置为主键

null=Ture:该字段是否为空

四、创建模型类

在Django应用的models.py文件中,创建模型类。每个模型类都继承自django.db.models.Model类,并定义了类属性来表示数据库表的字段。字段可以是字符型、整数型、日期型等各种类型。

例如:

class UserModel(models.Model):#设置用户数据表
    #设置账号
    uid = models.AutoField(auto_created=True,primary_key=True,unique=True,db_index=True)
    #设置密码
    password = models.CharField(max_length=20)
    #设置姓名
    name = models.CharField(null=True,max_length=20)
    #设置年龄
    age = models.IntegerField(default=18)

我们设置了一个叫UserModel的类,并设置了四个属性,分别是uid,password,name,age分别代表账号,密码,姓名和年龄,并设置的他们的字段类型和字段选项,并设置uid为主键。但是这样并没有成功创建好一个数据表,在Django笔记(1)中我提到过,每当你的model.py文件发生变化是,就必须进行数据迁移,这样才能将数据表更新至你的数据库中,先使用:

python manage.py makemigrations #生成迁移文件

来生成迁移文件,然后

python manage.py migrate #执行迁移

来执行迁移,这样才成功创建好一个数据表并在数据库中更新出来

五、数据库基础操作

数据库的基础操作,也就是所谓的增删改查,下面我来一一讲解,如何在对数据库进行增删改查

(1)增

(1)创建对象实例,调用save()方法
    obj = Author()
        obj.first_name = "li"
        obj.last_name = "si"
        obj.save()
(2)创建对象并初始化,再调用save()方法
    obj = Author(first_name='li',last_name='si')
    obj.save()
(3)使用create方法
    Author.objects.create(first_name='li',last_name='si')
(4)使用get_or_create方法,可以防止重复
    Author.objects.get_or_create(first_name='li',last_name='si')

以上是增加数据的四种方法

(2)删

使用Queryset的delete方法:
    #删除指定条数据
    Author.objects.filter(first_name='li').delete()
    #删除所有数据
    Author.objects.all().delete()#注意:object不能直接使用delete方法


    使用模型对象的delete方法
    obj = Author.objects.get(id=5)
    obj.delete()

(3)改

#修改数据
Author.objects.filter(last_name='si').update(last_name='wu')
模型没得定义update的方法,直接给字段赋值,并调用save,能实现update的功能,比如:
obj = Author.objects.get(id=3)
        obj.first_name='zhang'
        obje.save()

save在更新时会有新的字段,如果只想更新某一个字段,减少数据库操作,我们可以:
    obj.first_name = 'li'
    obj.save(update_fields=['first_name'])

(4)查

1)基础操作
get():获取单条数据:

Author.objects.get(id=123)

如果没有找到符合条件的对象,会引发模型类.DoesNotExist异常如果找到多个,会引发模型类.

Multiple0bjectsReturned异常

first():返回查询集(QuerySet)中的第一个对象

last():返回查询集中的最后一个对象

count():返回当前查询集中的对象个数

exists():判断查询集中是否有数据,如果有数据返回True没有反之all():获取全部数据:

Author.objects.all()

values():获取指定列的值,可以传多个参数!返回包含字典的列表(保存了字段名和对应的值)

Author.objects.all().values ("password")

values_list():获取指定列的值,可以传多个参数!返回包含元组列表(只保存值)

Author.objects.all().values_list('password')
2)进阶操作
#获取个数
Author.objects.filter( name='seven').count()

Author.objects.filter(id__gt=1)#获取id大于1的值
# select * from Author where id > 1

Author.objects.filter(id__gte=1)#获取id大于或等于1的值
# select * from Author where id >= 1

Author.objects.filter(id_lt=10)#获取id小于10的值
# select * from Author where id < 10

Author.objects.filter(id__lte=10)#获取id小于或等于10的值
# select * from Author where id <= 10

Author.objects.filter(id_lt=10, id_gt=1)#获取id大于1且小于10的值
# select * from Author where id < 10 and id > 1

Author.objects.filter(id_in=[11,22,33])#获取id在11、22、33中的数据
#select * from Author where id in (11,22,33)

Author.objects.filter(name_icontains="ven" ) # icontains大小写不敏感

Author.objects.filter(name_regex="^ven")#正则匹配

Author.objects.filter(name_iregex="^ven") #正则匹配,忽略大小写

Author.objects.filter(age_range=[10,20])#范围bettwen and

# startswith, istartswith,endswith, iendswith:
#以什么开始,以什么结束,和上面一样带i的是大小写不敏感的,其实不带i的也忽略大小写


Author.objects.filter(name='seven').order_by('id ')# asc升序
Author.objects.filter(name='seven').order_by('-id')# desc降序

Author.objects.all()[10:20]#切片,取所有数据的10条到20条,分页的时候用的到,
#下标从0开始,不能为负数,可以实现分页

(5)分页器

分页器是一种用于将大量数据分割成多个页面的工具。它是在Web应用程序中常用的一种功能,用于在用户界面上展示大量数据时,将数据分成多个页面以便用户浏览。

而分页的方法也分为两种,分别的手动分页和使用分页器:

那么接下来,我来展示一下,如何手动进行分页:

#实现分页功能
persons = PersonModel.objects.all()
persons = persons[(page-1) * per_page.: page * per_page]
#总页数
PersonModel.objects.count()
return render(request,'paginate.html', { 'persons ' : persons})

而此时我们需要在视图里面接受后端传来的数据:

<html Lang="en"><head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h2>分页功能</h2>
<hr>
<ul>
{% for person in persons %}
<li>{{ person.name }} - {{ person.age }}</li>
{%endfor %}
</ul>

这样,我们就是实现了手动分页

而第二种方式,就是使用分页器

from django.core.paginator import Paginator

def paginate2(request, page=1):

    per_page = 10

    all_data = PersonModel.objects.allo

    #分页器
    paginator = Paginator(all_data, per_page)

    persons = paginator. page(page)#获取第page页的数据

六、配置mysql数据库

由于Django自带的是sqlite数据库,虽然也够用,但是还是讲一下如何配置mysql数据库

要在Django项目种使用mysql数据库,首先我们使用指令安装MySQL的python驱动

pip install mysqlclient

然后在settings.py找到DATABASE设置项

DATABASES = {
    #sqlite配置
    "default": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": BASE_DIR / "db.sqlite3",
    },
    # mysql配置
    # "default":{
    #     "ENGING":'django.db.backends.mysql',
    #     "NAME":'',#数据库名字
    #     "USER":'root',#数据库用户名
    #     "PASSWORD":'940812',#用户名对应的密码
    #     "HSOT":'127.0.0.1',#IP地址
    #     "PORT":'3306',#端口
    # }
}

将自己的mysql配置好以后应用数据库迁移: 在命令行中切换到Django项目的根目录,并运行以下命令应用数据库迁移:

python manage.py migrate

然后我们可以运行以下命令来测试Django与MySQL数据库的连接是否成功:

python manage.py check

以下就是今天的内容,想了解更多可以上官网或者自己搜索了解,如果有说的不对的地方,还望指出!谢谢观看。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
学习Django时,使用PyCharm作为开发工具可以提高效率。PyCharm是一款功能强大的Python集成开发环境,它提供了丰富的功能和工具,可以帮助开发者更好地编写和调试Django应用程序。 在学习Django的过程中,可以使用PyCharm创建Django项目,并使用其内置的Django支持功能来简化开发过程。PyCharm可以自动识别Django项目的结构,并提供代码补全、语法检查、调试等功能,帮助开发者更快地编写和调试代码。 此外,PyCharm还提供了集成的版本控制系统,如Git,可以方便地管理和追踪代码的变化。它还支持自动化测试和部署,可以帮助开发者更好地进行项目管理和发布。 总之,使用PyCharm作为开发工具可以提高Django学习的效率和便利性。它的强大功能和友好的用户界面使得开发者可以更专注于代码的编写和项目的开发。\[1\] \[2\] \[3\] #### 引用[.reference_title] - *1* *3* [PyCharm平台下初学Django框架](https://blog.csdn.net/howard2005/article/details/93491364)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [pycharm平台下的Django教程](https://blog.csdn.net/Sunshine_ZCC/article/details/73918408)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值