ForeignKey
来实现的。仍是以文章和做者的案例进行讲解。class User(models.Model): username = models.CharField(max_length=20) password = models.CharField(max_length=100) class Article(models.Model): title = models.CharField(max_length=100) content = models.TextField() author = models.ForeignKey("User",on_delete=models.CASCADE)
那么之后在给Article
对象指定author
,就可使用如下代码来完成:javascript
article = Article(title='abc',content='123') author = User(username='zhiliao',password='111111') # 要先保存到数据库中 author.save() article.author = author article.save()
而且之后若是想要获取某个用户下全部的文章,能够经过article_set
来实现。示例代码以下:html
user = User.objects.first() # 获取第一个用户写的全部文章 articles = user.article_set.all() for article in articles: print(article)
而且若是想要将文章添加到某个分类中。可使用一下的方式:java
category = Category.objects.first() article = Article(title='bbb',content='vvv') article.author = FrontUser.objects.first() category.article_set.add(article,bulk=False)
使用bulk=False
,那么Django会自动的保存article,而不须要在添加到category以前先保存article。
或者是另一种解决方式是,在添加到category.article_set
中以前,先将article
保存到数据库中。可是若是article.category
不能为空,那么就产生一种死循环了,article没有category
不能保存,而将article添加到cateogry.artile_set
中,又须要article以前是已经存储到数据库中的。
* 若是是上面的那种需求,建议使用bulk=False
的解决方案。python
models.OnetToOneField
来实现的。这个OneToOneField
其实本质上就是一个外键,只不过这个外键有一个惟一约束(unique key)
,来实现一对一。class FrontUser(models.Model): username = models.CharField(max_length=200) class UserExtension(models.Model): school = models.CharField(max_length=100) user = models.OneToOneField("FrontUser",on_delete=models.CASCADE) # 经过userextension来访问UserExtension对象 user = FrontUser.objects.first() print(user.userextension)
UserExtension
的对象,能够经过user
来访问到对应的user对象。而且FrontUser
对象可使用userextension
来访问对应的UserExtension
对象。OneToOneField
中添加一个related_name
参数。示例代码以下:class FrontUser(models.Model): username = models.CharField(max_length=200) class UserExtension(models.Model): school = models.CharField(max_length=100) user = models.OneToOneField("FrontUser",on_delete=models.CASCADE,related_name='extension') # 经过extension来访问到UserExtension对象 user = FrontUser.objects.first() print(user.extension)
FrontUser
的对象就能够经过extension
属性来访问到对应的UserExtension
对象。应用场景:好比文章和标签的关系。一篇文章能够有多个标签,一个标签能够被多个文章所引用。所以标签和文章的关系是典型的多对多的关系。ios
实现方式:Django
为这种多对多的实现提供了专门的Field
。叫作ManyToManyField
。仍是拿文章和标签为例进行讲解。示例代码以下:web
class Article(models.Model): title = models.CharField(max_length=100) content = models.TextField() tags = models.ManyToManyField("Tag",related_name="articles") class Tag(models.Model): name = models.CharField(max_length=50)
在数据库层面,实际上Django
是为这种多对多的关系创建了一个中间表。这个中间表分别定义了两个外键,引用到article
和tag
两张表的主键。数据库