一对多:
- 数据库:article_article表内容:
- 一对多关联操作:
1 def one_to_many_view(request): 2 article = Article(title='西游记',content='abc...') 3 category = Category.objects.first() 4 author = FrontUser.objects.first() 5 article.category = category 6 article.author = author 7 article.save() 8 return HttpResponse('success')
1 # Article模型使用外键引用Category模型时,会使Category自动生成一个article_set的方法(可用related_name改名); 2 # models.py>>>Article模型: category = models.ForeignKey('Category',on_delete=models.CASCADE,null=True,related_name='articles') 3 #获取分类category的第一条数据,可使用article_set的方法获取该数据所对应的文章; 4 category = Category.objects.first() 5 #获取一条数据: 6 article = category.article_set.first() 7 print(article) 8 >>> < Article: (id:1, title:百年孤独) > 9 #获取多条数据(改名为:articles): 10 articles = category.articles.all() 11 for article in articles: 12 print(article) 13 >>> <Article:(id:1,title:百年孤独)> 14 >>> <Article:(id:3,title:西游记)>
1 # 要添加数据后再将其添加到分类中时,当article_article数据库表中的category_id不为null时,使用‘bulk=False’确保在 2 # 添加时同时将article的数据进行保存,后将category的数据进行保存,使其运行时不造成冲突; 3 article = Article(title='三国演义',content='123...') 4 article.author = FrontUser.objects.first() 5 category.articles.add(article,bulk=False) 6 return HttpResponse('success')
二、一对一:
- 一对一关联操作:
1 # 使用model.OneToOneField 外键,school只能传入一个唯一的值; 2 class UserExtension(models.Model): 3 school = models.CharField(max_length=100) 4 user = models.OneToOneField('FrontUser',on_delete=models.CASCADE)
1 #models.One_To_OneField对应的方法为引用的模块名小写,没有 “_set” 2 def one_to_one(request): 3 #获取frontuser对应的值: 4 extension =UserExtension.objects.first() 5 print(extension.user) 6 >>> < FrontUser: (id:1, username:陈) > 7 8 #获取userextension对应的值: 9 user = FrontUser.objects.first() 10 print(user.userextension) 11 >>> < UserExtension: (id:1, school:新东方, user_id:1) > 12 13 return HttpResponse('success')
三:多对多:
- 数据库会增加一个 article_tag_article 的中间文件:
- 关联操作:
1 #一篇文章有多个标签 2 def many_to_many(request): 3 article = Article.objects.first() 4 #tag = Tag(name='热门文章') 5 tag = Tag(name='爆冷文章') 6 # Many_To_Many没有‘bulk=False’,需调用save()保存; 7 tag.save() 8 article.tag_set.add(tag)
1 #一个标签有多篇文章 2 def many_to_many(request): 3 tag = Tag.objects.get(pk=1) 4 article = Article.objects.get(pk=3) 5 # 将article添加到tag中 6 tag.articles.add(article) 7 return HttpResponse('success')