Django加Vue电商项目实战05 模型数据生成

前言

学无止境,无止境学。大家好,我是张大鹏,之前在抖音有5万多粉丝,不过现在不拍视频,专心写公众号了。笔者目前是高级Python工程师,之前是全栈工程师,主要擅长Golang和Python开发,对于JavaVue,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)

整体目录结构如下:

Django加Vue电商项目实战05 模型数据生成


运行结果如下:

Django加Vue电商项目实战05 模型数据生成


梳理模型表

在上一个教程中,我们创建了多个模型,这个教程中将会使用到。我们先梳理一下这些模型关联的表和字段:

用户基本信息表

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(02))
        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(02), "salary": zdppy_random.random_int(300050000),
                           "age": zdppy_random.random_int(2070), "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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!