假设有两张表,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返回的是一个对象序列化时会报错;
还是先获取对应主表对象,再获取主表对象具体的字段值。