django_model_一对一映射

2023-09-19 10:20:54

settings 相关配置

# settings.py
	...
    DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'djangos',
        'USER': 'root',
        'PASSWORD': '990212',
        'HOST': 'localhost',
        'PORT': '33062',
    }
}
# 安装数据库驱动
pip install mysqlclient==2.1.1
pip install pymysql
# 与manage.py同级目录下的__init__.py
import pymysql
pymysql.install_as_MySQLdb()
# 数据迁移命令
python manage.py makemigrations appname
python manage.py migrate
# 在数据库中 配置好数据表后,逆向生成model
python manage.py inspectdb table1 table2 table3 > appname/models.py

模型关联与映射

  • 一对一映射
  • 一对多映射
  • 多对多映射、多对多自定义中间表
  • 自关联

一对一映射

使用场景

  1. 扩展模型信息
  2. 限制关联模型的数量:确保一个模型只能与另一个模型关联一次

eg:

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE())
    bio = models.TextField(blank=True)
    profile_picture = models.ImageField(upload_to="profile_pictures", blank=True)

    def __str__(self):
        return self.user.username


class UserAddress(models.Model):
    user_profile = models.OneToOneField(UserProfile, on_delete=models.CASCADE)
    street_address = models.CharField(max_length=100)
    city = models.CharField(max_length=50)
    state = models.CharField(max_length=50)
    postal_code = models.CharField(max_length=10)

    def __str__(self):
        return f'{self.user_profile.username}\'s address'

扩展了django自带的用户模型

使用 OneToOneField 创建对应关系,在例子中 使用一对一映射,来控制每个用户只能有一个地址。

注意点

  • 参数:on_delete

    • 主对象被删除时,如何处理关联对象。若使用一对一映射则必须指定 on_delete 参数。

    • on_delete=models.CASCADE : 级联删除,关联对象被删除后,其关联字段同时也被删除。

    • on_delete=models.PROTECT:保护关联对象, 当关联对象将被删除时,出发 ProtectedError 异常。

    • on_delete=models.SET_NULL, null=True: 当关联对象被删除时,将关联字段设置为NULL, 前提是该字段允许为空。

    • on_delete=models.setDEFAULT, default=1:当关联对象被删除时,将关联字段设置为其默认值,前提是该字段设置了默认值。

    • on_delete=fun_cname: 在 func_name(instance, **kwargs) 自定义删除操作, instance 表示要删除对象的引用。

      def delete_action(instance, other_args):
          ...
      
      
      def pack_delete_action(other_args):
          other_args = ...
      
          return lambda instance: delete_action(instance, other_args)
      
      
      class UserTest(models.Model):
          test_field = models.OneToOneField(User, on_delete=pack_delete_action("some...info.."))
      

结束

更多推荐

携手共赴数智未来|维视智造出席2023英特尔工业物联网大会

​​9月20日,“数智芯生力”2023英特尔工业物联网大会”于上海隆重举办。作为主办方,英特尔邀请了赋能工业数字化技术创新的多位合作伙伴,展示当前中国工业物联网领域的优秀技术与成果,共聚一堂积极探讨数字化机器视觉、控制机器人等领域的热点话题。在工业数字化转型和“双碳”目标驱动下,制造业众多领域正在以前所未有的速度步入工

大型集团借力泛微搭建语言汇率时区统一、业务协同的国际化OA系统

国际化、全球化集团,业务遍布全世界,下属公司众多,集团对管理方式和企业文化塑造有着很高的要求。不少大型集团以数字化方式助力全球统一办公,深化企业统一管理。面对大型集团全球化的管理诉求,数字化办公系统作为集团日常使用的平台,自然需要适应企业管理升级,灵活适应国际化带来的管理发展变化和满足全球协同办公需求。最重要的是实现信

华为OD:跳房子I

题目描述跳房子,也叫跳飞机,是一种世界性的儿童游戏。游戏参与者需要分多个回合按顺序跳到第1格直到房子的最后一格跳房子的过程中,可以向前跳,也可以向后跳。假设房子的总格数是count,小红每回合可能连续跳的步教都放在数组steps中,请问数组中是否有一种步数的组合,可以让小红两个回合跳到最后一格?如果有,请输出索引和最小

ffmpeg抠图

1.不用png,用AVFrame2.合流3.图片抠图透明(1.)mp4扣yuv图,(2)用1.把一张yuv标记为透明然后av_hwframe_transfer_data到GPU(3)用抠图算法函数对yuv进行处理(4)qsv的h264_qsv只支持nv12和qsv,但qsv本身并不限制像素格式,比如在qsv里可以用vp

MES系统是如何采集Modbus设备数据的呢?

随着工业自动化的不断发展,各种协议和标准在行业中变得越来越重要。其中,Modbus协议是一种在工业自动化领域非常流行的通信协议,而Modbus网关是实现Modbus协议转换的关键设备。一、MES系统与Modbus网关MES系统即制造执行系统(ManufacturingExecutionSystem),是一套面向制造过程

【含java面试题】深入解析栈溢出及JVM参数设置

AI绘画关于SD,MJ,GPT,SDXL百科全书面试题分享点我直达2023Python面试题2023最新面试合集链接2023大厂面试题PDF面试题PDF版本java、python面试题项目实战:AI文本OCR识别最佳实践AIGamma一键生成PPT工具直达链接玩转cloudStudio在线编码神器玩转GPUAI绘画、A

SQL性能优化

当你的数据里只有几千几万,那么SQL优化并不会发挥太大价值,但当你的数据里去到了几百上千万,SQL优化的价值就体现出来了!因此稍微有些经验的同学都知道,怎么让MySQL查询语句又快又好是一件很重要的事情。要让SQL又快又好的前提是,我们知道它「病」在哪里,而explain关键字就是MySQL提供给我们的一把武器!在我们

需要每日温习的java八股文基础

一、java(1)集合1.list:LinkedList、ArrayList和VectorArrayList、LinkedList和Vector的区别,场景和扩容机制源码LinkedList接口实现类,链表,插入删除,没有同步,线程不安全ArrayList接口实现类,数组,随机访问,没有同步,线程不安全Vector接口

SpringBoot_快速入门

一、SpringBoot概述文档下载地址:https://docs.spring.io/spring-boot/docs/current/reference/1.SpringBoot介绍概述:SpringBoot开发团队认为Spring操作太繁琐了,目的在于简化开发配置,能够快速搭建开发环境,集成了tomcat,对于开

如何使用反 CSRF 令牌保护您的网站和 Web 应用程序

防止跨站点请求伪造攻击(CSRF/XSRF)的最常见方法是使用反CSRF令牌,该令牌只是一个唯一值集,然后由Web应用程序需要。CSRF是一种客户端攻击,可用于将用户重定向到恶意网站、窃取敏感信息或在用户会话中执行其他操作。幸运的是,使用CSRF令牌来保护用户免受CSRF攻击及其后果相对容易。CSRF原理那我们具体看看

前端工程师笔试题【校招】

1.设一个有序的单链表中有n个结点,现要求插入一个新结点后使得单链表仍然保持有序,则该操作的时间复杂度为()。如果要在一个有序的单链表中插入一个新节点,以保持单链表的有序性,时间复杂度取决于插入的位置。以下是几种常见的情况:在链表的头部插入新节点:如果要在链表的头部插入一个新节点,只需要将新节点的指针指向当前链表的头节

热文推荐