zoukankan      html  css  js  c++  java
  • Django:ORM中ForeignKey外键关系分析

    假设有两张表,Role和User,因为多个用户会对应一个角色,属于多对一关系,所以User中的rolename字段使用ForeignKey,第一个参数为要关联的表Role,第二个参数related_name是用来反查这个角色下有几个用户时用的。

    class Role(models.Model):
        '''
        角色表
        '''
        role_name = models.CharField(max_length=50)
        create_time = models.DateTimeField(auto_now_add=True)
        status = models.CharField(max_length=10)
    
        def __str__(self):
            return self.role_name
    
    
    class User(models.Model):
        '''
        用户信息表,用户表中role_name字段为ForeignKey意思为外键,代表多对一关系,多个用户对应一个角色
        '''
    
        gender = (
            ('male', ''),
            ('female', '')
        )
        member_code = models.CharField(max_length=20, unique=True)
        name = models.CharField(max_length=30)
        password = models.CharField(max_length=256)
        role_name = models.ForeignKey(Role, related_name='member_role', default=3)
        email = models.EmailField(max_length=50)
        sex = models.CharField(max_length=10, choices=gender, default='')
        create_time = models.DateTimeField(auto_now_add=True)
        status = models.CharField(max_length=10, default=1)
    
        def __str__(self):
            return self.name

      

    注意:

      虽然User表中字段名称叫role_name,但是由于它是外键,所以它在实际的表中字段名会自动加上_id叫role_name_id,字段的值为Role表中的主键id的值

    需求:

      获取某个人对应的角色信息

      代码:获取membe_code为01010101的用户对应的角色名称

    from account.models import User
    
    def user():
        user = User.objects.get(member_code='01010101')
        print user.role_name.role_name

    user()

      疑问:

        这里为什么要用user.role_name.role_name方式呢?

      解答:

        因为user.role_name,返回的是Role对象,所以需要再次.role_name获取对应的角色名称,同样想获得该角色的创建时间可以user.role_name.create_time

        但是因为Role模型有对象可读性代码

         def __str__(self):
              return self.role_name

        所以其实可以直接user.role_name直接获取该用户所属角色,但是不建议这样使用,尤其是后台处理数据后需要序列化,但是user.role_name返回的是一个对象序列化时会报错;

        还是先获取对应主表对象,再获取主表对象具体的字段值。

  • 相关阅读:
    redis的常用操作
    django中的缓存 单页面缓存,局部缓存,全站缓存 跨域问题的解决
    drf 下的 url控制 解析器 响应器 版本控制 分页
    django下的 restful规范 Drf框架 psotman的安装使用 及一些容易遗忘的小点
    vue学习 自建服务器 node
    vue学习 条件、循环指令、computed、watch、局部、全局、组件间交互
    Linux入门
    redis进阶
    redis介绍和安装
    DRF解析器和渲染器
  • 原文地址:https://www.cnblogs.com/gcgc/p/11245888.html
Copyright © 2011-2022 走看看