前言
学无止境,无止境学。大家好,我是张大鹏,之前在抖音有5万多粉丝,不过现在不拍视频,专心写公众号了。笔者目前是高级Python工程师,之前是全栈工程师,主要擅长Golang和Python开发,对于Java,Vue,React也有一些研究。工作之余,喜欢学习和分享,希望能够通过此公众号”张大鹏520″,将自己学到的东西分享给大家,和大家一起交流,一起成长,一起进步。
今天要给大家分享的是《Django加Vue电商项目实战05 模型数据生成》,这是一个系列的教程,从零基础到项目实战。在本教程中,我会给大家介绍Django如何新增数据,如何新增一对一关系的数据,如何新增一对多关系的数据,如何新增多对多关系的数据等。还会配套相关的练习,大家学完以后可以自行通过练习题巩固和加深对知识点的理解。
如果大家需要本教程的PDF电子书或者完整的源码,可以在文末找到获取方式哈。
Django中单独运行脚本
核心知识点1:设置Python的依赖包查找路径
import sys
# 设置目录查找路径
sys.path.insert(0, '../../')
核心知识点2:在脚本运行之前设置Django环境信息
import os
# 设置Django配置信息
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'z05_django_orm.settings')
import django
django.setup()
借用之前的z05_django_orm项目,在index应用下创建data包,然后在包中创建一个Python文件:
import os
import sys
# 设置目录查找路径
sys.path.insert(0, '../../')
# 设置Django配置信息
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'z05_django_orm.settings')
import django
django.setup()
# 导入模型
from index.models import UserBaseInfo
if __name__ == "__main__":
# 测试模型
all = UserBaseInfo.objects.all().values()
print(all)
整体目录结构如下:
运行结果如下:
梳理模型表
在上一个教程中,我们创建了多个模型,这个教程中将会使用到。我们先梳理一下这些模型关联的表和字段:
用户基本信息表
class UserBaseInfo(models.Model):
"""
用户基本信息
"""
id = models.AutoField(verbose_name='编号', primary_key=True)
username = models.CharField(verbose_name='用户名称', max_length=30)
password = models.CharField(verbose_name='密码', max_length=20)
status = models.CharField(verbose_name='状态', max_length=1)
createdate = models.DateTimeField(verbose_name='创建日期', db_column='createDate', default=timezone.now)
def __str__(self):
return self.username
class Meta:
managed = True
verbose_name = '人员基本信息'
db_table = 'user'
用户基本信息表包含的字段有:
-
id:主键 -
username:用户名 -
password:密码 -
status:状态 -
createdate:创建日期
部门信息表
class DepartInfo(models.Model):
"""
部门信息
"""
id = models.AutoField(verbose_name='编号', primary_key=True)
depart_name = models.CharField(verbose_name='部门名称', max_length=30)
# default=timezone.now:解决时区问题
createdate = models.DateTimeField(verbose_name='创建日期', db_column='createDate', default=timezone.now)
def __str__(self):
return str(self.id)
class Meta:
managed = True
verbose_name = '部门信息'
db_table = 'depart'
部门信息表包含的字段有:
-
id:主键 -
depart_name:部门名称 -
createdate:创建日期
用户扩展信息表
class UserExtraInfo(models.Model):
"""用户扩展信息"""
id = models.AutoField(verbose_name='编号', primary_key=True)
username = models.CharField(verbose_name='用户名称', max_length=30)
true_name = models.CharField(verbose_name='真实姓名', max_length=30)
sex = models.IntegerField(verbose_name='性别')
salary = models.DecimalField(verbose_name='薪水', max_digits=8, decimal_places=2)
age = models.IntegerField(verbose_name='年龄', )
department = models.CharField(verbose_name='部门', max_length=20)
status = models.CharField(verbose_name='状态', max_length=1)
createdate = models.DateTimeField(verbose_name='创建日期', db_column='createDate', default=timezone.now)
memo = models.TextField(verbose_name='备注', blank=True, null=True)
# 一对一关联
user = models.OneToOneField(UserBaseInfo, on_delete=models.CASCADE)
def __str__(self):
return str(self.id)
class Meta:
managed = True
verbose_name = '人员扩展信息'
db_table = 'user_extra'
用户扩展信息表包含的字段有:
-
id:主键 -
username:用户名称 -
true_name:真实姓名 -
sex:性别 -
salary:薪资 -
age:年龄 -
department:部门 -
status:状态 -
createdate:创建时间 -
memo:备注 -
user_id:与用户建立一对一的关联。这个字段本质上是个外键,然后还添加了唯一约束。
银行卡信息表
class CardInfo(models.Model):
"""银行卡信息"""
id = models.AutoField(verbose_name='编号', primary_key=True)
card_no = models.CharField(verbose_name='卡号', max_length=30)
bank = models.CharField(verbose_name='所属银行', max_length=30)
# 一对多关联
# on_delete=models.CASCADE:级联删除
# related_name="user_card":反向关联字段
user = models.ForeignKey(UserBaseInfo, related_name="user_card", on_delete=models.CASCADE)
def __str__(self):
return str(self.id)
class Meta:
managed = True
verbose_name = '用户卡信息'
db_table = 'card_info'
银行卡信息表包含的字段有:
-
id:主键 -
card_no:卡号 -
bank:所属引号 -
user_id:用户ID,是一个外键,指向用户表
技能信息表
class SkillInfo(models.Model):
"""技能信息"""
id = models.AutoField(verbose_name='编号', primary_key=True)
skill_name = models.CharField(verbose_name='特长', max_length=30)
createdate = models.DateTimeField(verbose_name='创建日期', db_column='createDate', default=timezone.now)
# 多对多关联
user = models.ManyToManyField(UserBaseInfo, db_table="user_skill")
def __str__(self):
return str(self.id)
class Meta:
managed = True
verbose_name = '特长信息'
db_table = 'skill_info'
技能信息表包含的字段有:
-
id:主键 -
skill_name:技能名称 -
createdate:创建时间 -
user:与用户表建立了一张多对多的user_skill关系映射表
单独对模型添加数据
添加用户信息
基本的添加逻辑:
-
1、先清空用户基本信息表的数据 -
2、准备要插入的数据 -
3、执行插入 -
4、查询用户基本信息表的数据,确认是否添加成功
清空数据的代码:
UserBaseInfo.objects.all().delete()
插入数据的代码:
UserBaseInfo.objects.create(**user_dict)
查询数据的代码:
all = UserBaseInfo.objects.all().values()
在大批量的导入测试数据之前,我们先插入一条用户基本信息进行测试。
import os
import sys
# 设置目录查找路径
sys.path.insert(0, '../../')
# 设置Django配置信息
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'z05_django_orm.settings')
import django
from django.utils import timezone
django.setup()
# 导入模型
from index.models import UserBaseInfo
if __name__ == "__main__":
# 先清空数据
UserBaseInfo.objects.all().delete()
# 准备数据
user_dict = {
"username": "zhangdapeng",
"password": "zhangdapeng520",
"status": "1",
"createdate": timezone.now(),
}
# 执行创建
UserBaseInfo.objects.create(**user_dict)
# 查询结果
all = UserBaseInfo.objects.all().values()
print(all)
添加部门信息
import os
import sys
# 设置目录查找路径
sys.path.insert(0, '../../')
# 设置Django配置信息
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'z05_django_orm.settings')
import django
from django.utils import timezone
django.setup()
# 导入模型
from index.models import DepartInfo
if __name__ == "__main__":
# 先清空数据
DepartInfo.objects.all().delete()
# 准备数据
user_dict = {
"depart_name": "研发部",
"createdate": timezone.now(),
}
# 执行创建
DepartInfo.objects.create(**user_dict)
# 查询结果
all = DepartInfo.objects.all().values()
print(all)
添加用户扩展信息
如何添加一个一对一关联的用户扩展信息:
# 添加用户基本信息
user = UserBaseInfo.objects.create(**user_dict)
# 注意:这一步添加了外键
user_extra_dict["user"] = user
# 添加用户扩展信息
UserExtraInfo.objects.create(**user_extra_dict)
完整示例代码:
import os
import sys
# 设置目录查找路径
sys.path.insert(0, '../../')
# 设置Django配置信息
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'z05_django_orm.settings')
import django
from django.utils import timezone
django.setup()
# 导入模型
from index.models import UserBaseInfo, UserExtraInfo
if __name__ == "__main__":
# 先清空数据
UserBaseInfo.objects.all().delete()
UserExtraInfo.objects.all().delete()
# 准备数据
user_dict = {
"username": "zhangdapeng",
"password": "zhangdapeng520",
"status": "1",
"createdate": timezone.now(),
}
user_extra_dict = {
"username": "zhangdapeng",
"true_name": "张大鹏",
"sex": 1,
"salary": 33333,
"age": 33,
"department": "研发部",
"status": "1",
"memo": "程序员,喜欢看书,码代码",
"createdate": timezone.now(),
}
# 添加用户基本信息
user = UserBaseInfo.objects.create(**user_dict)
# 注意:这一步添加了外键
user_extra_dict["user"] = user
# 添加用户扩展信息
UserExtraInfo.objects.create(**user_extra_dict)
# 查询结果
print(UserBaseInfo.objects.all().values())
print(UserExtraInfo.objects.all().values())
添加银行卡信息
import os
import sys
# 设置目录查找路径
sys.path.insert(0, '../../')
# 设置Django配置信息
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'z05_django_orm.settings')
import django
from django.utils import timezone
django.setup()
# 导入模型
from index.models import UserBaseInfo, CardInfo
if __name__ == "__main__":
# 先清空数据
UserBaseInfo.objects.all().delete()
CardInfo.objects.all().delete()
# 准备数据
user_dict = {
"username": "zhangdapeng",
"password": "zhangdapeng520",
"status": "1",
"createdate": timezone.now(),
}
card_dict = {
"card_no": "111",
"bank": "招商银行",
}
# 添加用户基本信息
user = UserBaseInfo.objects.create(**user_dict)
# 注意:这一步添加了外键
card_dict["user"] = user
# 添加银行卡信息
CardInfo.objects.create(**card_dict)
# 查询结果
print(UserBaseInfo.objects.all().values())
print(CardInfo.objects.all().values())
添加技能信息
如何添加多对多关系:
# 添加用户基本信息
user = UserBaseInfo.objects.create(**user_dict)
# 添加技能信息
skill = SkillInfo(**skill_dict)
# 注意:多对多关系,要用 外键名_set 来代替赋值
skill.user_set = user
skill.save()
完整代码:
import os
import sys
# 设置目录查找路径
sys.path.insert(0, '../../')
# 设置Django配置信息
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'z05_django_orm.settings')
import django
from django.utils import timezone
django.setup()
# 导入模型
from index.models import UserBaseInfo, SkillInfo
if __name__ == "__main__":
# 先清空数据
UserBaseInfo.objects.all().delete()
SkillInfo.objects.all().delete()
# 准备数据
user_dict = {
"username": "zhangdapeng",
"password": "zhangdapeng520",
"status": "1",
"createdate": timezone.now(),
}
skill_dict = {
"skill_name": "Python",
"createdate": timezone.now(),
}
# 添加用户基本信息
user = UserBaseInfo.objects.create(**user_dict)
# 添加技能信息
skill = SkillInfo(**skill_dict)
# 注意:多对多关系,要用 外键名_set 来代替赋值
skill.user_set = user
skill.save()
# 查询结果
print(UserBaseInfo.objects.all().values())
print(SkillInfo.objects.all().values())
统一对模型添加数据
注意:这里的zdppy_random属于作者的自研库,读者在使用代码的时候,请使用其他的随机库代替。此自研库暂时不开源,读者需要的话,可以私我作者获取。
import os
import sys
# 设置目录查找路径
sys.path.insert(0, '../../')
# 设置Django配置信息
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'z05_django_orm.settings')
import django
from django.utils import timezone
django.setup()
# 导入模型
from index.models import UserBaseInfo, DepartInfo, UserExtraInfo, CardInfo, SkillInfo
# 随机数据生成器
import zdppy_random
if __name__ == "__main__":
# 先清空数据
UserBaseInfo.objects.all().delete()
DepartInfo.objects.all().delete()
UserExtraInfo.objects.all().delete()
CardInfo.objects.all().delete()
SkillInfo.objects.all().delete()
# 准备数据
for _ in range(100):
username = zdppy_random.random_ename()
status = str(zdppy_random.random_int(0, 2))
user_dict = {
"username": username,
"password": zdppy_random.random_str(16),
"status": status,
"createdate": timezone.now(),
}
# 添加用户基本信息
user = UserBaseInfo.objects.create(**user_dict)
# 添加部门信息
department = zdppy_random.random_department_chinese()
department_dict = {
"depart_name": department,
"createdate": timezone.now(),
}
DepartInfo.objects.create(**department_dict)
# 添加用户扩展信息
user_extra_dict = {"username": username, "true_name": zdppy_random.random_name(),
"sex": zdppy_random.random_int(0, 2), "salary": zdppy_random.random_int(3000, 50000),
"age": zdppy_random.random_int(20, 70), "department": department, "status": status,
"memo": zdppy_random.random_str(100), "createdate": timezone.now(), "user": user}
UserExtraInfo.objects.create(**user_extra_dict)
# 添加银行卡信息
card_dict = {
"card_no": zdppy_random.random_bank_card_no(),
"bank": zdppy_random.random_bank(),
"user": user
}
CardInfo.objects.create(**card_dict)
# 添加技能信息
skill_dict = {
"skill_name": zdppy_random.random_str(8),
"createdate": timezone.now(),
}
skill = SkillInfo(**skill_dict)
skill.user_set = user
skill.save()
# 查询结果
print(UserBaseInfo.objects.all().count())
print(DepartInfo.objects.all().count())
print(UserExtraInfo.objects.all().count())
print(CardInfo.objects.all().count())
print(SkillInfo.objects.all().count())
结语
关注我不迷路,欢迎关注我的微信公众号”张大鹏520″,如果您对此文章感兴趣,欢迎点赞收藏,留言评论。
文中所有代码,只需要打赏20元,然后留言评论“已打赏”,即可获取哦。
本文的PDF电子书版,只需要打赏3元,然后留言评论“已打赏”,即可获取哦。
写文章不容易,不喜勿喷哈,如果有想要学编程,学项目,或者在工作中有项目难以单独完成需要提供帮助的同学,欢迎私信我哈。生活不易,想要利用学到的编程知识,业余赚点零花钱。
接项目:网站开发,APP开发,各种管理系统开发。
带徒弟:Python编程教学,Golang编程教学,前端编程教学。
谢谢您!!!
原文始发于微信公众号(张大鹏520):Django加Vue电商项目实战05 模型数据生成
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/48615.html