Django的ORM中的小知识

让我们探讨下orm中related_name这个参数的功能


1.首先我们定义两个数据类

<code>class User(models.Model):
Name = models.CharField()
Role = models.ForeignKey(Role,on_delete=models.CASECADE)
class Role(models.Model):
Role_name = models.CharFIeld()/<code>

一个用户表,一个角色表

2.那么我们想知道Name为hah的同学属于什么角色,应该怎么样查呢?

<code>正向查找

user = User.objects.get(name=‘hah’)
user.Role.all()
通过这个我们可以找到hah所属的所有角色,比如他是一个manager/<code>

3.那么我们想知道角色为manager的都有哪些同学呢?

<code>反向查找

role = Role.objects.get(role_name=‘manager’)
role.user_set.all()
通过这两行代码就可以查出角色是manager的所有同学,其中user_set是class类的小写_set,
这是固定的查询用法,为什么呢,因为定义User类中外键的属性时候,没有用到related_name/<code>

那么我们重新定义一下User类

<code>class User(models.Model):
Name = models.CharField()

Role = models.ForeignKey(Role,on_delete=models.CASECADE,related_name=‘roleuser')/<code>

这个时候想知道manager角色包含那些同学的时候,我们可以这样来查找

<code>如果有related_name属性
role = Role.objects.get(name=‘manager’)
role.roleuser.all()
其实就是将user_set换成了上面我们自定义的related_name (rolesuer)/<code>


分享到:


相關文章: