django_model_一对一映射

settings 相关配置

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

模型关联与映射

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

一对一映射

使用场景

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

eg:

python 复制代码
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 表示要删除对象的引用。

      python 复制代码
      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.."))

结束

相关推荐
_OP_CHEN几秒前
用极狐 CodeRider-Kilo 开发俄罗斯方块:AI 辅助编程的沉浸式体验
人工智能·vscode·python·ai编程·ai编程插件·coderider-kilo
Wpa.wk3 分钟前
自动化测试 - 文件上传 和 弹窗处理
开发语言·javascript·自动化测试·经验分享·爬虫·python·selenium
用户99045017780093 分钟前
ruoyi-vue2集成flowable6.7.2后端篇
后端
_OP_CHEN4 分钟前
【Python基础】(二)从 0 到 1 入门 Python 语法基础:从表达式到运算符的全面指南
开发语言·python
qq_12498707537 分钟前
基于springboot框架的小型饮料销售管理系统的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·spring·毕业设计
Warren9811 分钟前
datagrip新建oracle连接教程
数据库·windows·云原生·oracle·容器·kubernetes·django
我命由我1234514 分钟前
Python Flask 开发:在 Flask 中返回字符串时,浏览器将其作为 HTML 解析
服务器·开发语言·后端·python·flask·html·学习方法
拾忆,想起16 分钟前
设计模式:软件开发的可复用武功秘籍
开发语言·python·算法·微服务·设计模式·性能优化·服务发现
IT_陈寒23 分钟前
JavaScript 性能优化:5个被低估的V8引擎技巧让你的代码提速50%
前端·人工智能·后端
沃斯堡&蓝鸟28 分钟前
DAY28 元组和OS模块
python·元组与os模块