首页 > 其他 > 详细

Django的ORM基本操作详解

时间:2019-02-16 00:54:39      阅读:425      评论:0      收藏:0      [点我收藏+]

一对多关系

-------------------models.py----------------
from django.db import models

class Classes(models.Model):
    # 班级表
    title = models.CharField(max_length=32)
    m = models.ManyToManyField(Teachers) # 多对多

class Teachers(models.Model):
    # 老师表
    name = models.CharField(max_length=32)

class Student(models.Model):
    # 学生表
    username = models.CharField(max_length=32)
    age = models.IntegerField()
    gender = models.BooleanField()
    cs = models.ForeignKey("Classes",on_delete=models.CASCADE)  #cs是Classes的一个对象

表中的数据:

Classes技术分享图片       Student技术分享图片

示例:
    -查询所有学生的名称以及其所在班级的名称,QuerySet

stu_list = Student.objects.all()
# [obj,obj,ibj,obj]  里面是一个一个的对象

stu_list = Student.objects.all().values(id,username)
# [{‘id‘:1,‘username‘:‘xx‘},{‘id‘:‘‘,‘username‘:‘‘}...]  里面是字典

stu_list = Student.objects.all().values_list(id,username)
[(1,小王),(2,小明)...]  # 里面是元组

# 正解        
stu_list = Student.objects.all().values(username,cs__title)
# <QuerySet [{‘username‘: ‘小王‘, ‘cs__title‘: ‘2班‘}, {‘username‘: ‘小明‘, ‘cs__title‘: ‘2班‘}, {‘username‘: ‘小刘‘, ‘cs__title‘: ‘2班‘}, {‘username‘: ‘小李‘, ‘cs__title‘: ‘3班‘}]>
for row in stu_list: # 里面元素是字典 print(row[username],row[cs__title])

这里的跨表操作只是跨了两张表,跨三张表也一样的道理,例如,假如还有一张校区表School(有字段name),Classes表
中的另一个字段sch是外键,依赖于校区表,那么,找到所有学生的姓名、班级、校区则是:

 stu_list = Student.objects.all().values(username,cs__title,cs__title__name)

正反向查询(通过双下划线跨表查询)

 

# 找到2班的学生
# -----正向-----
a=models.Student.objects.filter(cs__title=2班)  # 3个Student对象
    print(a) # 正向查
# <QuerySet [<Student: Student object (1)>, <Student: Student object (2)>, <Student: Student object (3)>]>
#------反向------
obj = models.Classes.objects.filter(title=2班).first()
    print(obj.student_set.all()) # 反向查
# <QuerySet [<Student: Student object (1)>, <Student: Student object (2)>, <Student: Student object (3)>]

 

总结:

1、类代表数据库的表
2、类的对象代指数据库的一行记录
3、ForeignKey(外键)字段代指关联表中的一行数据(类的对象)
4、ManyToManyField字段,自动生成第三张表,依赖关联表对第三张表间接操作
5、 -正向:cs字段   (推荐使用)
      -反向:小写类名_set(还有一个 .all()方法,返回所有对象) 默认是这个名字,但也可以修改,
       Student表的外键中有一个 related_name= 参数,可换成想要的名字。反向查只需
       小写类名_set换成修改好的名字即可,

 

Django的ORM基本操作详解

原文:https://www.cnblogs.com/zq8421/p/10386538.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!