Django——多对一关系
2019-08-24 本文已影响1人
布拉豆
Django的ORM中,有多种关系,例如多对一,一篇文章只能有一个作者,但是一个作者可以写多篇文章,这样就形成了多对一的关系。
1. 给项目添加多对一关联
先来给文章绑定一个作者的关联,多对一的关联字段是ForeignKey,这里的参数有绑定账户User,反向查询是通过related_name绑定一个write,代码如下:
class Article(models.Model):
headline = models.CharField(null=True, blank=True, max_length=300)
content = models.TextField(null=True, blank=True)
auth = models.ForeignKey(to=User, related_name="write", null=True,blank=True,default=None)
def __str__(self):
return self.headline
在ForeignKey的参数中,另外几个参数:null=True表示允许为空,blank表示允许是不填,default参数设置默认为空
这个default参数比较重要,一旦数据库中有数据,然后给表格添加字段,这样就必须给原有数据的新字段加一个默认值。如果不加default,命令行中会提示选择。
下图是新加字段正常通过:
image通过admin界面查看Article,会出现一个单选的下拉框,如下(文章只有一个作者,但是一个作者可以被多篇文章选择):
image2. 通过多对一关系查询和反查询
用多篇文章关联admin这个用户之后,然后通过查询查看关联结果,以及正向查询和反向查询。
首先是正向查询,也就是通过文章查作者(关联是文章关联作者),第一步是先获取一个文章的对象,然后是打印article.auth这个属性值,代码如下:
# 从文章整体中,获取出第一个文章
article = Article.objects.all().first()
# 打印文章的auth属性的值
article.auth
反向查询,既是通过用户的对象,查询看他是否有文章,代码如下:
# 获取用户列表中的第一个用户
user = User.objects.all().first()
# 查询他写的所有文章
articles = user.write.all()
# 这里的write是设置关联是related_name值
就当前项目来测试操作,如图(shell界面操作):
image首发于《Crossin的编程教室》
以上就是本篇文章的全部介绍内容了
!放在最后
如果文章中有什么错误或者建议修改的地方,欢迎留言纠正和回复
如果你喜欢本篇文章,不妨关注一下我们的公众号,每周更新两篇原创技术文档,都是干货
image