Django模型与后台管理

1.在settings.py中配置数据库。


DATABASES = {

'default': {

'ENGINE': 'django.db.backends.mysql',

'NAME': 'mysite',

'HOST': '192.168.1.1',

'USER': 'root',

'PASSWORD': 'pwd',

'PORT': '3306',

}

}

2.修改时区:TIME_ZONE设置为国内所在的时区Asia/Shanghai

3.添加app,INSTALLED_APPS中会自动包含下列条目

django.contrib.admin:admin管理后台站点

django.contrib.auth:身份认证系统

django.contrib.contenttypes:内容类型框架

django.contrib.sessions:会话框架

django.contrib.messages:消息框架

django.contrib.staticfiles:静态文件管理框架

4.创建模型

  • Django通过自定义Python类的形式来定义具体的模型,每个模型的物理存在方式就是一个Python的类Class,每个模型代表数据库中的一张表,每个类的实例代表数据表中的一行数据,类中的每个变量代表数据表中的一列字段。

  • Django通过模型,将Python代码和数据库操作结合起来,实现对SQL查询语言的封装。也就是说,你可以不会管理数据库,可以不会SQL语言,你同样能通过Python的代码进行数据库的操作。Django通过ORM对数据库进行操作,奉行代码优先的理念,将Python程序员和数据库管理员进行分工解耦。

  • black=true:允许为空值

  • 如果想让日期字段(如 DateField 、 TimeField 、 DateTimeField )或数值字段(如IntegerField 、 DecimalField 、 FloatField )接受空值,要同时添加 null=True 和 blank=True 。

  • 只要觉得模型有问题,就可以运行 python manage.py check ,

它能捕获全部常见的模型问题。

5.迁移


python manage.py makemigrations polls

6.在数据库中创建表:


python manage.py migrate

7.修改模型时的操作分三步:

  • 在models.py中修改模型;

  • 运行python manage.py makemigrations为改动创建迁移记录;

  • 运行python manage.py migrate,将操作同步到数据库。

  1. admin后台管理站点
  • 创建一个可以登录admin站点的用户

python manage.py createsuperuser
  • 依次输入用户名,邮箱和密码

9.修改后台url

  • 在实际环境中,为了站点的安全性,我们不能将管理后台的url随便暴露给他人,不能用/admin/这么简单的路径。

  • 打开根url路由文件mysite/urls.py,修改其中admin.site.urls对应的正则表达式,换成你想要的,比如:


from django.conf.urls import url

from django.contrib import admin

urlpatterns = [

url(r'^my/set/', admin.site.urls),

]

这样,我们必须访问http://127.0.0.1:8000/my/set/才能进入admin界面。

10.登入站点

  • 当前只有两个可编辑的内容:groups和users。它们django.contrib.auth模块提供的身份认证框架。

11.4. 在admin中注册app

  • 现在还无法看到投票应用,必须先在admin中进行注册,告诉admin站点,请将polls的模型加入站点内,接受站点的管理。

打开polls/admin.py文件,加入下面的内容:


from django.contrib import admin

from .models import Question

admin.site.register(Question)

12.__str__() 就是其中一例,其作用是让模型知道如何显示自身.

13.数据访问:all(),filter(),exclude(),get(),value(),value_list()

Publisher.objects.all() :

参考网址:https://blog.csdn.net/Fe_cow/article/details/80669146

首先, Publisher 是我们定义的模型。想查找数据就应该使用相应的模型。

然后,访问 objects 属性。这叫管理器(manager),管理器负责所有“表层”数据操作,包括(最重要的)数据查询。所有模型都自动获得一个 objects 管理器,需要查询模型实例时都要使用它。

最后,调用 all() 方法。这是 objects 管理器的一个方法,返回数据库中的所有行。虽然返回的对象看似一个列表,但其实是一个查询集合(QuerySet)——表示数据库中一系列行的对象。

所有数据库查找操作都遵守这种一般模式,即在依附于模型的管理器上调用方法,执行相应的查询。

14.过滤数据:filter() 方法过滤数据,返回一个查询集合

  • 注意,查找操作默认使用 SQL = 运算符做精确匹配查找。

Publisher.objects.filter(name__contains="press")

  • 注意, name 和 contains 之间有两个下划线。与 Python 一样,Django 使用双下划线表示“魔法”操作。这里,Django 把 __contains 部分转换成 SQL LIKE 语句:

SELECT id, name, address, city, state_province, country, website

FROM books_publisher

WHERE name LIKE '%press%';
  • 支持的其他查找类型有: icontains (不区分大小写的 LIKE ), startswith 和 endswith,以及 range (SQLBETWEEN 语句)

15.检索单个对象:get()


Publisher.objects.get(country="U.S.A.")

得到多个对象的查询和不返回结果都报错。

16.排序数据: order_by() 方法

1.如果想根据多个字段排序(以第一个字段排不出顺序时使用第二个字段),提供多个参数

2.还可以反向排序。方法是在字段名称前面加上“-”(减号)

3.虽然 order_by() 有一定的灵活性,但是每次都调用它相当繁琐。多数时候,我们始终使用同一个字段排序。


class Meta:

ordering = ['name']
  • 内嵌在 Publisher 类定义体中的 class Meta (即要缩进,放在 class Publisher 内部)。任何模型都可以使用 Meta 类指定多个针对所在模型的选项。指定这个选项后,使用 Django 数据库 API 检索 Publisher 对象时,如果没有明确调用 order_by() ,都按照 name 字段排序。

17.可以将过滤和排序一起执行:


Publisher.objects.filter(country="U.S.A.").order_by("-name")

18.切片数据:


Publisher.objects.filter(country="U.S.A.").order_by("-name")

19.只更新需要修改的值: update() 方法有返回值,是一个整数,表示修改的记录数量

Publisher.objects.filter(id=52).update(name='ApressPublishing')

20.删除对象:从数据库中删除一个对象,只需在对象上调用 delete() 方法


p = Publisher.objects.get(name="O'Reilly")

p.delete()

Publisher.objects.filter(country='USA').delete()

Publisher.objects.all().delete()

21.自定义标注的方式是为模型字段指定verbose_name 参数

(不太明白标注是什么,待补充)

22.自定义修改列表:

  • 默认情况下,在后台的修改列表显示的是各个对象的 __str__() 方法返回的结果。

  • 可以改进这种默认行为,在修改列表中添加几个其他字段。比如说,可以在列表中显示作者的电子邮件地址;另外,如果能按照名字和姓排序就好了。为此,要为 Author 模型定义一个 ModelAdmin 子类。这个类是定制管理后台的关键,其中最基本的一件事是指定修改列表页面显示的字段。参照下述代码修改 admin.py文件:


from django.contrib import admin

from mysite.books.models import Publisher, Author, Book

class AuthorAdmin(admin.ModelAdmin):

list_display = ('first_name', 'last_name', 'email')

admin.site.register(Publisher)

admin.site.register(Author, AuthorAdmin)

admin.site.register(Book)
  • list_display ,把它的值设为一个元组,指定要在修改列表页面

显示的字段名称。当然,模型中必须有这些字段。

  • 修改 admin.site.register() 调用,在 Author 后面添加 AuthorAdmin 。你可以把这行代码理解为“以 AuthorAdmin 中的选项注册 Author 模型”。 admin.site.register() 函数的第二个参数可选,其值是一个ModelAdmin 子类。如果不指定第二个参数( Publisher 和 Book 模型就是这样),Django 使用默认选项注册模型。

23.添加一个简单的搜索框。在 AuthorAdmin 类中添加 search_fields :


class AuthorAdmin(admin.ModelAdmin):

list_display = ('first_name', 'last_name', 'email')

search_fields = ('first_name', 'last_name')

24.添加过滤器:

1.为 list_filter 属性赋值一个字段元组,在修改列表页面的右边创建过滤器。


class BookAdmin(admin.ModelAdmin):

list_display = ('title', 'publisher', 'publication_date')

list_filter = ('publication_date',)

2。提供日期过滤器的另一种方法是使用date_hierarchy 选项,如下所示:


class BookAdmin(admin.ModelAdmin):

list_display = ('title', 'publisher','publication_date')

list_filter = ('publication_date',)

date_hierarchy = 'publication_date'
  • 添加这个选项之后,修改列表上边会显示一个日期层级导航栏,这个导航栏先显示年份,然后向下显示月份和具体某一天。

25.修改默认排序

修改默认的排序方式,让修改列表页面的图书始终以出版日期倒序排列。默认情况下,修改列表根据模型中class Meta 里的 ordering 属性排序,不过我们没设定,因此没有顺序。


class BookAdmin(admin.ModelAdmin):

list_display = ('title', 'publisher','publication_date')

list_filter = ('publication_date',)

date_hierarchy = 'publication_date'

ordering = ('-publication_date',)
  • ModelAdmin 子类中的 ordering 选项与模型的 class Meta 中的 ordering 属性的作用完全一样,不过只使用列表中的第一个字段名称。 ordering 选项的值是一个字段名称列表或元组,如果想倒序,加上减号即可。

26.定制字段的排序方式:


class BookAdmin(admin.ModelAdmin):

list_display = ('title', 'publisher', 'publication_date')

list_filter = ('publication_date',)

date_hierarchy = 'publication_date'

ordering = ('-publication_date',)
  • fields 选项还有一个作用:排除特定的字段,禁止编辑。只需去掉想排除的字段即可。

27.定制多对多关系字段


class BookAdmin(admin.ModelAdmin):

list_display = ('title', 'publisher','publication_date')

list_filter = ('publication_date',)

date_hierarchy = 'publication_date'

ordering = ('-publication_date',)

filter_horizontal = ('authors',)
  • filter_horizontal 可以指定多个字段,在元组中列出各个字段的名称即可。

  • filter_vertical 选项,它的作用与 filter_horizontal 完全一样,不过得到的JavaScript 界面是纵向排列的两个选择框,而不是横向的。

  1. raw_id_fields 选项:

class BookAdmin(admin.ModelAdmin):

list_display = ('title', 'publisher','publication_date')

list_filter = ('publication_date',)

date_hierarchy = 'publication_date'

ordering = ('-publication_date',)

filter_horizontal = ('authors',)

raw_id_fields = ('publisher',)
  • 这个选项的值是一个外键字段名称元组,各个字段在管理后台中显示为简单的文本输入框( <inputtype="text"> ),而不是
上一篇:Problem D: 来开个书店吧


下一篇:详谈pg逻辑复制系列之逻辑复制适用场景及原理介绍(一)