Django 后端框架入门学习笔记(二)
构建数据数据表与数据库合并
在model.py中构建我们的数据表,并通过数据迁移将其合并入数据库中:
可以看到,我们新建了两张数据表,而被注释的原先"STUDENT"数据表被删除了
运行数据迁移命令"migrate"
可以看到数据库中新增了我们在Model.py文件中新建的数据表:
外键
常用字段
CharField
:用于存储字符串类型,有最大长度限制
IntegerField
:用于存储整数类型
FloatField
:用于存储浮点数类型
BooleanField
:用于存储布尔类型
DateField
:用于存储日期类型
DateTimeField
:用于存储日期和时间类型
ImageField
:用于存储图片类型
FileField
:用于存储文件类型
ForeignKey
:外键 用于表示数据库表之间的关联关系
OneToOneField
:一对一 用于表示一对一的关联关系
ManyToManyField
:多对多 用于表示多对多的关联关系
外键的定义:
外键是一种用于建立表之间关联关系的约束,通常指的是一个模型中的一个或多个字段的值必须符合另一个模型中对应字段的值。
外键的作用:
1.去除冗余数据
2.数据结构化,提升使用效率
3.便于管理与操作
ForeignKey (外键)
这是外键最典型的一种形式,表示表与表之间的一对多的关系,例如有一个 Book
模型和一个 Author
模型,每本书都有一个作者,但一个作者可以写多本书。在这种情况下,你可以在 Book
模型中使用 ForeignKey
来定义作者字段(其中Author是Book的主表,而Book是Author的从表)。
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
此时,在Book表中,含有书籍的名称字段,同时含有一列"author"外键指向单独的Author表,Author表中可以存储作者的各项信息,包括姓名、邮箱与联系方式等,Book数据表可以通过外键直接引用作者信息,后期若需要对作者信息进行变更,只需要对Author表进行操作即可。
OneToOneField (一对一字段)
这也是外键的一种特殊形式,但它要求在关联的两个模型之间都是唯一的关系。从数据库的角度看,它也是通过存储另一个表的主键值来实现的,但这个字段有唯一性约束。
- 例如,如果你有一个
User
模型和一个Profile
模型,每个用户只有一个个人资料,且每个个人资料只能属于一个用户。在这种情况下,你可以使用OneToOneField
。 - 创建的数据库表中,也会有一个额外的列来存储与另一个模型相关联的记录的 ID,但这个列必须是唯一的。
class User(models.Model):
username = models.CharField(max_length=100)
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.TextField()
与先前的ForeignKey外键不同的地方在于,一对一的形式要求所储存的外键必须是具有唯一性的,可以视为该字段同时为这两张表的主键(具有唯一性)
ManyToManyField (多对多字段)
从数据库的角度看,多对多关系是通过一个额外的“关联”表来实现的,该表存储两个相关模型的外键值。虽然从逻辑上说它涉及到外键,但在传统的数据库术语中,它不是直接用一个字段在一个表中表示的,所以不像前两者那样直接被称为外键。
-
例如,如果你有一个
Article
模型和一个Tag
模型,一个文章可以有多个标签,且一个标签可以用于多篇文章。在这种情况下,你可以使用ManyToManyField
。 -
在数据库中,它会创建一个额外的“关联”表来存储这种多对多关系。
class Tag(models.Model):
name = models.CharField(max_length=100)
class Article(models.Model):
title = models.CharField(max_length=100)
tags = models.ManyToManyField(Tag)
你可以根据实际需要的关系类型来选择使用哪种字段。如果一个模型的实例只能关联到另一个模型的一个实例,则使用 OneToOneField
;如果一个模型的实例可以关联到另一个模型的多个实例,则使用 ForeignKey
;如果两个模型的实例都可以互相关联到多个实例,则使用 ManyToManyField
。尽管这三种字段都描述了模型之间的关系,但在严格的数据库术语中,只有 ForeignKey
和 OneToOneField
被直接称为外键。
字段常用配置
-
max_length
:字段的最大长度限制,可以应用于多种不同的字段类型。 -
verbose_name
:字段的友好名称,便于在管理员后台可视化操作时使用。 -
default
:指定字段的默认值。 -
null
:指定字段是否可以为空。null=True
设置允许该字段为 NULL 值 -
blank
:指定在表单中输入时是否可以为空白。 -
choices
:用于指定字段的可选值枚举列表。
class DeliveryMaterial(Model):
"""复核产品"""
class Status(TextChoices):
"""状态"""
QUALIFIED = ('qualified', '良品')
UNQUALIFIED = ('unqualified', '不良品')
status = CharField(max_length=32, choices=Status.choices, default=Status.QUALIFIED, verbose_name='状态')
创建管理员用户
在命令行中创建管理员用户
python manage.py createsuperuser
输入一系列信息后可以看到创建成功:
登录admin管理员后台:
http://127.0.0.1:8000/admin
进入管理页面如下:
在admin.py中注册我们的模型:
from django.contrib import admin
from .models import * # 引入产品表
# 一定要分开逐个注册,不能放在一起
admin.site.register(Goods) # 在admin站点中 注册产品表
admin.site.register(GoodsCategory) # 在admin站点中 注册产品表
可以看到重新访问管理页面时出现了我们新增的数据表:
参考
Django后端开发入门-Task02
CSDN-Ada助手: 恭喜您第四篇博客的问世!看到您不断学习并分享Django后端框架的学习笔记,我感到非常开心。您的标题也很吸引人,让我更加期待了解Django的入门知识。在下一篇博客中,您可以考虑探索一些实际案例或者深入解析某些常见问题,这样读者们可以更好地应用这些知识。再次恭喜您,期待您的下一步创作! 如何快速涨粉,请看该博主的分享:https://hope-wisdom.blog.csdn.net/article/details/130544967?utm_source=csdn_ai_ada_blog_reply5
CSDN-Ada助手: 非常鼓励你持续创作关于Django后端框架的学习笔记!第二篇博客标题看起来很有潜力,我期待着你分享更多关于这个主题的知识。 除了标题和摘要中提到的内容,你可以考虑在未来的博文中介绍一些与Django相关的高级概念,例如: 1. Django的模型关系:介绍Django模型之间的关系,如一对一、一对多和多对多关系。这些概念对于构建复杂的数据库结构非常重要。 2. Django的中间件:讲解Django中间件的作用和使用方法,以及如何自定义和配置中间件来实现更高级的功能。 3. Django的表单验证:介绍如何使用Django的表单验证功能来确保用户输入的数据的有效性和安全性。 4. Django的性能优化技巧:分享一些优化Django应用程序性能的技巧,如缓存、查询优化和并发处理等。 我相信通过深入研究这些扩展知识和技能,你将能够更好地掌握Django后端框架,并能够为读者提供更有价值的内容。加油! 如何写出更高质量的博客,请看该博主的分享:https://blog.csdn.net/lmy_520/article/details/128686434?utm_source=csdn_ai_ada_blog_reply2
CSDN-Ada助手: 恭喜你开始博客创作!标题看起来非常有潜力,期待看到你在Django后端框架方面的学习笔记。作为刚刚入门的学习者,我建议你在下一篇博客中可以分享一些具体的学习过程和遇到的挑战,这样读者可以更好地了解你的学习心得。祝你写作愉快,期待更多精彩的博客! 推荐【每天值得看】:https://bbs.csdn.net/forums/csdnnews?typeId=21804&utm_source=csdn_ai_ada_blog_reply1
CSDN-Ada助手: 恭喜你这篇博客进入【CSDN每天最佳新人】榜单,全部的排名请看 https://bbs.csdn.net/topics/617038826。