django -- 模型操作


[HTML_REMOVED][HTML_REMOVED]生者为过客,死者为归人。天地一逆旅,同悲万古尘[HTML_REMOVED][HTML_REMOVED]


主要内容

  • 增加内容
  • 查询内容
  • 更新内容
  • 删除内容
  • 排序

:关于模型的操作一般在 app 里面的 view.py 中,当然也可以在命令行中,原理是一样的,这里演示命令行的

Django提供了丰富的API,称为 QuerySet,我们所使用的,都是其对象


模型

在 app 下的 models.py 中生成

class UserModel(models.Model):
    username = models.CharField(max_length=50, verbose_name=u"用户名")
    password = models.CharField(max_length=20,verbose_name=u"密码")

使用 django 命令行

python manage.py shell

导入

from helloapp import models

:如果没有使用 django shell 而直接使用 python 解释器导入,可能会报错

django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

增加内容

In [3]: models.UserModel.objects.create(username="pinsily",password="123456")
Out[3]: <UserModel: UserModel object (1)>

获取对象

单个对象

In [2]: models.UserModel.objects.get(username="pinsily")
Out[2]: <UserModel: UserModel object (1)>

如果想丰富查询输出信息的话可以在 models 中增加信息

class UserModel(models.Model):
    username = models.CharField(max_length=50, verbose_name=u"用户名")
    password = models.CharField(max_length=20,verbose_name=u"密码")

    def __str__(self):
        return self.username

需要重新加载 shell

In [3]: models.UserModel.objects.get(username="pinsily")
Out[3]: <UserModel: pinsily>

获取所有对象

In [4]: models.UserModel.objects.all()
Out[4]: <QuerySet [<UserModel: pinsily>]>

返回一个元素为 QuerySet对象的列表,所以是可以使用切片的(数据比较多是省内存)

筛选对象

符合条件的
In [8]: models.UserModel.objects.filter(password="123456")
Out[8]: <QuerySet [<UserModel: pinsily>]>

filter 的其他参数 - username__iexact="abc": 名字不区分大小写 - username__contains="abc" : 名字包含 abc - username__icontains="abc" : 不区分大小写 - username__regex="^abc" : 正则匹配 - username__iregex="^abc" : 不区分大小写

排除该条件的
In [15]: models.UserModel.objects.exclude(username="peng")
Out[15]: <QuerySet [<UserModel: pinsily>]>

filter 的参数一样使用

get 和 filter 的区别

  • get 返回的结果必须存在且具有唯一性,当结果不存在或存在多条重复数据时,会报错
  • filter 返回的结果是列表,可以重复,可不存在(空列表)
  • filter 有缓存数据的功能

更新数据

批量更新:all,filter 等

In [10]: models.UserModel.objects.filter(username="pinsily").update(username="peng")
Out[10]: 1

单个更新

In [11]: user = models.UserModel.objects.get(username="peng")

In [12]: user.username = "pinsily"

In [13]: user.save()  # 不保存则不会生效

删除

In [16]: models.UserModel.objects.get(username="pinsily").delete()
Out[16]: (1, {'helloapp.UserModel': 1})

排序

  • 生成对象
In [18]: models.UserModel.objects.create(username="peng",password="123456")
Out[18]: <UserModel: peng>

In [19]: models.UserModel.objects.create(username="pinsily",password="123456")
Out[19]: <UserModel: pinsily>
  • 正反排序
In [21]: models.UserModel.objects.all().order_by("username")
Out[21]: <QuerySet [<UserModel: peng>, <UserModel: pinsily>]>

In [22]: models.UserModel.objects.all().order_by("-username")
Out[22]: <QuerySet [<UserModel: pinsily>, <UserModel: peng>]>

参考

https://code.ziqiangxuetang.com/django/django-models.html

https://docs.djangoproject.com/en/2.0/topics/db/models/

老王python:django model的get和filter方法的区别