django之Model理解,ORM之一对多增删改查

一、创建用户和博文两张表

用户和博文是一对多的关系,外键在多的一方建立。

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')

猜你喜欢

转载自blog.csdn.net/weixin_43173892/article/details/82901691