数据库表关系

一对多:

  • 数据库: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')

     

posted @ 2019-03-06 14:51  F·灬小人物  阅读(289)  评论(0编辑  收藏  举报