• django_model_一对一映射


    settings 相关配置

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

    模型关联与映射

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

    一对一映射

    使用场景

    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'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    扩展了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.."))
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12

    结束

  • 相关阅读:
    Vue接收接口返回的mp3格式数据并支持在页面播放音频
    Linux环境基础开发工具使用
    在项目中,关于前端实现数据可视化的技术选择
    Linux新手教程||Linux vi/vim
    分布式事务管理Atomikos
    流批结合计算以及更多原生分析能力支持
    linux基础
    云平台相关知识点
    k8s的node节点重启后pod不正常运行
    23种设计模式之 : 模板方法设计模式
  • 原文地址:https://blog.csdn.net/qq_40924514/article/details/133016538