模型的修改

  • 新增一个字段

    如果设置的字段的括号里有默认值(default=20),那么生成迁移、执行迁移就不会有问题。

    注意:如果当前新增的字段不允许为空,并且没有设置默认值,则会在生成迁移(python manage.py makemigrations)时出现下列选项:

    1,提供一个一次性的值

    2,退出,修改当前的新增字段

    1,设置默认值

    2,允许为空

  • 删除字段

    删除字段只需在template中的目标文件中直接注释掉要删除的模板的变量,然后生成迁移、执行迁移。

  • 修改字段

    修改时注意类型的变化,数字类型可以转字符串,但是字符串转数字时需要当前的字符串符合数字类型的要求。

  • 删除模型

    直接在template中的目标文件中注释掉要删除的模板(class),然后生成迁移、执行迁移。

Django框架自带的后台管理

1,在浏览器访问 admin

http://127.0.0.1:8000/admin/

2,需要登录,因此要创建一个超级用户

在命令行执行一下命令进行创建python manage.py createsuperuser

3,重启启动服务后 使用创建的用户进行后台的登录

4,配置settings.py文件,配置语言和时区

1
2
3
4
5
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False

5,进入应用home中找admin.py配置后台

1
2
3
4
5
from django.contrib import admin
from .models import Users
# Register your models here.

admin.site.register(Users)

生成的表名是模板类名+s,点击它可以看到数据库的每一行的对象.

点击users object 可以增删改查此条内容.

1
2
3
4
5
6
7
8
9
10
class Users(models.Model):
# 属性
username = models.CharField(max_length=50)
email = models.CharField(max_length=100)
age = models.IntegerField()
sex = models.IntegerField()
addtime = models.DateTimeField(auto_now_add=True)

def __str__(self):
return self.username

你可以改变返回值来改变user object,比如返回每行的username.

设置users显示的数据的列表的可修改性.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Register your models here.
class UsersAdmin(admin.ModelAdmin):
# 要展示的字段
list_display = ('id','username','age','sex','email','addtime')

#list_editable 设置默认可编辑字段
list_editable = ['username', 'age','email']

#list_per_page设置每页显示多少条记录,默认是100条
list_per_page = 10

#ordering设置默认排序字段,负号表示降序排序
ordering = ('id',)

#过滤器
list_filter =('username', 'age', 'email')

#搜索字段
search_fields =('username', 'age', 'email')
# select * from users where username like '%ab%' or age like '%ab%' or email like '%ab%';

# 详细时间分层筛选 
date_hierarchy = 'addtime'

admin.site.register(Users,UsersAdmin)

模型的各种查询操作

  • 查询集-查询的数据对象的集合-结果集

    在管理器上调用过滤器方法会返回查询集,查询集表示从数据库中获取的对象集合.

    惰性执行:创建查询集不会带来任何数据库的访问,直到调用数据时,才会访问数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 如果获取不到符合条件的数据,会返回空的查询集  <QuerySet []>

# 全查询
data = Users.objects.all()
<QuerySet [<Users: Users object>, <Users: Users object>, <Users: Users object>]>

# 过滤 filter()
data = Users.objects.filter(sex=0)
data = Users.objects.filter(sex=0,age=22)
data = Users.objects.filter(sex=0).filter(age=26)

#排除 exclude()
data = Users.objects.exclude(sex=0)

# 排序 order_by()
data = Users.objects.all().order_by('-id')

# values() 一个对象构成一个字典,然后构成一个列表返回,限制返回的字段
data = Users.objects.all().values()
data = Users.objects.all().values('id','username','age')
  • 返回单个值的方法 只能返回一个结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# get() 获取一个对象
data = Users.objects.get(id=1)
data = Users.objects.get(age=1) X
data = Users.objects.get(sex=0) X

'''
get如果查询不到符合条件的数据 则抛出异常 DoesNotExist at /demo/ Users matching query does not exist.
get如果查询到多条数据,抛出异常 MultipleObjectsReturned at /demo/ get() returned more than one Users -- it returned 2!
'''
# count() 统计并返回查询条件的总条数
data = Users.objects.all()
print(data.count())

# first last
data = Users.objects.filter(sex=0).last()
data = Users.objects.filter(sex=0).first()

# exists() 检测查询条件的数据是否存在
data = Users.objects.filter(sex=2).exists()

其它查询

1
2
3
4
5
#限制级查询
#查询的前五个
data = Users.objects.all()[:5]
#查询的第六个到第十个
data = Users.objects.all()[5:10]
1
2
# 比较运算符
data = Users.objects.filter(age__gt=20)
1
2
3
4
5
6
7
8
#包含查询  like 模糊查询
# select * from user where name like '%admin%';
data = Users.objects.filter(username__contains='a')
data = Users.objects.filter(username__icontains='a')

#以‘a’开头或者结尾,关键词如上加i表示不区分大小写
data = Users.objects.filter(username__startswith='a')
data = Users.objects.filter(username__endswith='a')
1
2
3
#是否为空,后面的False是说为空为假
data = Users.objects.filter(username__isnull=False)
data = Users.objects.filter(username__isnotnull=False)
1
2
3
# in
# select * from user where id in 1,23
data = Users.objects.filter(id__in=[1,23])
1
2
3
4
5
# or
# select * from users where username like '%ab%' or age like '%ab%' or email like '%ab%';
from django.db.models import Q
data = Users.objects.filter(Q(username__contains='ab')|Q(age__contains='ab')|Q(email__contains='ab'))
print(data)