一、创建用户和博文两张表
用户和博文是一对多的关系,外键在多的一方建立。
class Users(models.Model):
account = models.CharField(max_length=30,null=False,unique=True)
password = models.CharField(max_length=20,null=False)
nickname = models.CharField(max_length=20,null=False,unique=True)
headimg = models.CharField(max_length=100)
gender = models.CharField(max_length=2)
city = models.CharField(max_length=20)
personsign = models.CharField(max_length=50)
class Article(models.Model):
art_id = models.CharField(max_length=30,primary_key=True)
title = models.CharField(max_length=30)
publish = models.DateTimeField()
content = models.TextField()
author = models.ForeignKey('Users',on_delete=models.CASCADE) #外键
python manege.py makemigrations #在APP的migration文件下生成创建表的脚本,相当于shell,并没有和数据库打交道。
python manage.py migrate #连接数据库,执行sql语句,生成表格。
二、增加记录
方式一:外键_id=主表的主键
Article.objects.create(art_id=art_id,title=title,publish=publish,content=content,author_id=1)
方式二:找到外键对应的主表的对象, 外键=主表的对象
Article.objects.create(art_id=art_id,title=title,publish=publish,content=content,author=authorobj)
三、查询(通过对象)
1、正向查询: 查询title对应的作者的名字:
先拿到博文对象,博文对象点外键就是作者对象,拿到作者对象,就可以拿到作者属性。
artobj = Article.objects.filter(title = 'title') #博文对象
userobj = artobj.author #通过外键拿到作者对象
nickname = userobj.nickname #拿任何作者属性
2、 反向查询:查询nickname写的博文的题目和时间
方式一:
先通过nickname拿到用户对象,再过滤查询
user_obj = Users.objects.get(nickname=nickname)[0]
art_list = Article.objects.filter(author = user_obj).values('title','publish')
print(res)
方式二:
先通过nickname拿到用户对象,再用户对象点博文表名_set.all()
user_obj = Users.objects.get(nickname=nickname)[0]
art_list = user_obj.article_set.all()
四、查询(通过双下划线)
核心:通过双下换线,链接到另一张表的字段
正向查询:查询title对应的作者的名字:
Users.objects.filter(article__title = '进程和线程的理解').values('nickname')
Article.objects.filter(title = '进程和线程的理解').values('author__nickname')
反向查询:查询nickname写的博文的题目和时间
art_list = Article.objects.filter(author__nickname = '石谦').values('title','publish') # 外键__主表字段=‘ 值 ’
反向查询:查询性别男写的博文的题目和时间
art_list = Article.objects.filter(author__gender='男').values('title', 'publish')