Django后端框架(八)admin后台管理|Meta类补充|关系映射

【admin管理后台】

Django提供了比较完善的后台管理数据库的接口,可供开发过程中调用和测试使用。

Django会搜集所有已注册的模型类,为这些模型类提供数据管理界面,供开发者使用。

【admin配置步骤】

  • 创建后台管理账号(超级用户),该账号为管理后台的最高权限账号

*超级用户可以创建多个

在终端运行以下命令:

python3 manage.py createsuperuser

后台管理页面如下:

【注册自定义模型类】

若要自己定义的模型类也能在/admin后台管理界中显示和管理,需要将自己的类注册到后台管理界面。

注册步骤:

1、在应用APP中的admin.py中导入注册要管理的模型models类:

from .models import 模型类名

2、调用admin.site.register方法进行注册:

admin.site.register(自定义模型类)

样例:

# file: bookstore/admin.py
from django.contrib import admin
from .models import Book  # 导入模型类Book

# Register your models here.
admin.site.register(Book)  # 注册模型类Book

****修改自定义模型类的数据样式:

在admin后台管理数据库中对自定义的数据记录都展示为'XXXXobject'类型的记录,不便于阅读和判断。

解决方案:在用户自定义的模型类中可以重写def __str__(self): 方法

# 样例:

class Book(models.Model):

        ...

        def __str__(self):

                return "书名" + self.title

【模型管理器类】

  • 作用:为后台管理界面添加便于操作的新功能
  • 说明:后台管理器类必须继承自django.contrib.admin里的ModelAdmin类
  • 使用方法:

1、在<应用APP>/admin.py里定义模型管理器类

class XXXXManager(admin.ModelAdmin):

        ...

2、绑定注册模型管理器和模型类(也在<应用APP>/admin.py中)

from django.contrib import admin

from .models import 模型类名

admin.site.register(XXXX, XXXXManager)

样例:

from django.contrib import admin
from .models import Book

class BookManager(admin.ModelAdmin):
    # 列表页显示哪些字段的列
    list_display = ['id', 'title', 'pub', 'price']

admin.site.register(Book, BookManager)

  • 样式属性:
    • list_display:控制哪些字段会显示在admin的修改列表页面中
    • list_display_links:控制list_display中的字段是否应该链接到对象的“更改”页面
    • list_filter:设置激活admin修改列表页面右侧栏中的过滤器
    • search_fields:设置启用admin更改列表页面上的搜索框(模糊查询)
    • list_editable:设置为模型上的字段名称列表,这将允许在更改列表页面上进行编辑

【Meta类补充】

通过Meta内嵌类定义模型类的属性,用法如下:

class Book(models.Model):

        title = CharField(...)

        class Meta:

                # 模型所用的数据表的名称(设置完成后需要立即更新同步数据库)

                db_table = '数据表名'

                # 给模型对象的一个易于理解的名称(单数),用于显示在/admin管理界面中

                verbose_name = '单数名'

                # 该对象复数形式的名称(复数),用于显示在/admin管理界面中

                verbose_name_plural = '复数名'


【关系映射】

在关系型数据库中,通常不会把所有数据都放在同一张表中,不易于扩展。

常见的关系映射有:

  • 一对一映射(如:一张身份证对应一个人)
  • 一对多映射(如:一个班级可以有多个学生)
  • 多对多映射(如:一个学生可以报多门课程,一门课程可以有多个学生学习)

【一对一映射的创建】

语法:OnrToOneField(类名, on_delete=xxx)

class A(model.Model):

        ...

class B(model.Model):

        属性 = models.OneToOneField(A, on_delete=xxx)

  • on_delete:级联删除(重要,必须指定)
    1. models.CASCADE:模拟SQL约束ON DELETE CASCADE的行为,并删除包含ForeignKey的对象
    2. models.PROTECT:抛出ProtectedError以阻止被引用对象的删除(等同于mysql默认的RESTRICT)
    3. SET_NULL:设置ForeignKey为null,需要指定null=True
    4. SET_DEFAULT:将ForeignKey设置为其默认值,必须设置ForeignKey的默认值

样例:

# file: <应用名>/models.py
from django.db import models

class Author(models.Model):
    '''作家模型类'''
    name = models.CharField('作家', max_length=50)

class Wife(models.Model):
    '''作家妻子模型类'''
    name = models.CharField('妻子', max_length=50)
    author = models.OneToOneField(Author, on_delete=models.CASCADE)  # 增加一对一属性

【一对一映射的数据创建】

  • 无外键的模型类:(如Author类)

author1 = Author.objects.create(name='王老师')

  • 有外键的模型类:(如Wife类)

# 方案一:关联obj(使用外键属性名,即author)

wife1 = Wife.objects.create(name='王老师', author=author1)

# 方案二:关联对应主键值(使用外键字段名,即author_id)

wife1 = Wife.objects.create(name='王老师', author_id=1)

*两种方案要严格按照要求填写,否则会报错

【一对一映射的数据查询】

  • 正向查询:直接通过外键属性查询(由 外键所在表 查询 主键所在表的信息)

# 通过wife查找author

from .models import Wife

wife = Wife.objects.get(name='王夫人')

print(wife.name, '的丈夫是', wife.author.name)

  • 反向查询:没有外键属性的一方,可以调用反向属性查询到关联的另一方
    • 反向关联属性为 实例对象.引用类名(引用类名要小写),如作家的反向引用为 作家对象.wife
    • 当反向引用不存在时,则会触发异常

author1 = Author.objects.get(name='王老师')

author.wife.name

【一对多映射】

*一对多需要明确出具体角色,在[多]表上设置外键

【一对多映射的创建】

当一个A类对象可以关联多个B类对象时:

class A(model.Model):

        ...

class B(model.Model):

        属性 = models.ForeignKey(A, on_delete=xx)

*ForeignKey必须指定on_delete模式

样例:

# file: <应用名>/models.py
from django.db import models

class Publisher(models.Model):
    '''出版社[一]'''
    name = models.CharField('名称', max_length=50, unique=True)

class Book(models.Model):
    '''书[多]'''
    title = models.CharField('书名', max_length=50)
    publisher = ForeignKey(Publisher, on_delete=models.CASCADE)

【一对多映射的数据创建】

先创建[一],再创建[多]

样例:

# 无外键的模型类:

pub1 = Publisher.objects.create(name='清华大学出版社')

# 有外键的模型类:

Book.objects.create(title='C++', publisher=pub1)  # 方案一

Book.objects.create(title='Java', publisher_id=1)  # 方案二

【一对多映射的数据查询】

  • 正向查询:(若要通过Book查询Publisher,则通过publisher属性查询即可)

abook = Book.objects.get(id=1)

print(abook.title, '的出版社是: ', abook.publisher.name)

  • 反向查询:

# 通过出版社查询对应的书

pub1 = Publisher.objects.get(name='清华大学出版社')

books = pub1.book_set.all()  # 通过book_set获取pub1对应的多个Book数据对象;

# book_set的构成是:模型类名的小写_set

# 以下是另一种方式获取:

books = Book.objects.filter(publisher=pub1)

【多对多映射】

*mysql中创建多对多需要依赖第三张表来实现,但Django中无需手动创建第三张表,Django会自动完成

【多对多映射的创建】

  • 语法:在关联的两个类中的任意一个类中,添加以下代码:

属性 = models.ManyToManyField(MyModel)

样例:

# 一个作者可以出版多本书,一本书可以由多名作者编写
class Author(models.Model):
    '''作家模型类'''
    name = models.CharField('作家', max_length=50)
    def __str__(self):
        return self.name

class Book(models.Model):
    '''书模型类'''
    title = models.CharField('书名', max_length=50)
    authors = models.ManyToManyField(Author)
    def __str__(self):
        return self.title

【多对多映射的数据创建】

  • 方案一:先创建author,再关联book

author1 = Author.objects.create(name='吕老师')

author2 = Author.objects.create(name = '王老师')

# 吕老师和王老师共同写了一本书Python

book11 = author1.book_set.create(title='Python')

author2.book_set.add(book11)

  • 方案二:先创建book,再关联author

book = Book.objects.create(title='Java')

# 郭老师和吕老师都参与了Java的创作

author3 = book.authors.create(name='郭老师')

book.authors.add(author1)

*Author类与Book类的多对多关联是通过往Book类添加了某属性(即authors)而实现的,因此可以将Author类比作是无外键的模型类,而Book类比作是有外键的模型类,这样符合Author类使用.book_set方法,而Book类没有.author_set方法的事实,便于记忆

【多对多的数据查询】

  • 正向查询:由 有多对多属性的对象 查询 另一方

# 通过Book查询对应的所有Author(此时多对多属性等价于objects)

book.authors.all()  # 获取book对应的所有的author信息

book.authors.filter(age__gt=80)  # 获取book对应的作者中年龄大于80岁的author信息

  • 反向查询:

# 通过Author查询对应的所有Book(利用反向属性book_set)

author.book_set.all()  # 无过滤条件

author.book_set.filter()  # 有过滤条件

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值