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返回的是一个对象序列化时会报错;

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

原文地址:https://www.cnblogs.com/gcgc/p/11245888.html