Manager属性
Manager是Django模型最重要的属性,通过使用Manager模型才可以操作数据库。默认情况下,Django会为每一个模型提供一个名为objects的Manager实例。Manager属性只能通过模型类访问。
自定义Manager类
1 | class Blog(models.Model): |
上例中的blog = models.Manager()
自定义Manager类(之前的情况是不加这一句的),可以通过Blog.blog.all()
查询数据,返回的结果是:1
<QuerySet [<Blog: Beatles Blog>, <Blog: Scott Blog>]>
改进一下:1
2
3qs = Blog.blog.all()
for b in qs:
print(b.name)
返回的结果是:1
2Beatles Blog
Scott Blog
执行SQL语句
- Manager.raw()
语法:Manager.raw(raw_query, params=None, translations=None)
针对同样的Blog模型
例:1
2
3blogs = Blog.blog.raw("select * from tst_blog") # 第一个blog是我在模型中将Manager()命名为blog,tst_blog是表
for b in blogs:
print(b.name)
输出结果:1
2Beatles Blog
Scott Blog
注意:如果不能返回数据则会抛出异常
- django.db.connection
django.db.connection对象提供了数据库连接操作,使用connection.cursor()方法可以得到一个游标对象,cursor.execute(sql,[paramas])方法用于执行指定的SQL语句。使用cursor.fetchone()或者cursor.fetchall()方法可以得到一个或全部结果。表与表之间的关系
多对一
在关系型数据库中通常使用外键来表示多对一关系,Django模型中的ForeignKey字段就是模型的外键,写在“多”的那个模型下,其第一个参数对应相关联的类,例如一个问题可以有多个选项:1
2
3
4
5class Question(models.Model):
content = models.CharField(max_length=128)
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE) # on_delete=models.CASCADE属性必须设置,表示级联删除
以上代码在生成数据库时,Django会自动在Choice所对应的表中添加字段question_id作为外键。
访问方法:
前向查询:通过 Choice中的外键查询Question1
2c = Choice.objects.get(pk=1)
c.question
反向查询:通过Question查询Choice1
2q = Question.objects.get(pk=1)
q.choice_set.all()
多对多
假设公司里一个员工属于一个或多个部门,每个部门有一个或多个员工,为了实现该组织架构,使用ManyToManyField字段类型:1
2
3
4
5
6class Department(models.Model):
name = models.CharField(max_length=50)
class Employee(models.Model):
departments = models.ManyToManyField(Department) # 多对多字段名用复数
name = models.CharField(max_length=50)
注意:可以在任一个模型中定义ManyToManyField,但是不能两个都定义。
对于多对多关系,Django会在数据库中额外创建一张关系表,关系表的命名规则是:应用程序名_模型1名_模型2名s,在上例中生成的表名为app_employee_departments
访问方法(类似反向查询):1
2d = Department.objects.get(id=3)
d.Employee_set.all()
一对一
使用OneToOneField表示一对一关系,第一个参数是模型名。这种关系用的少。