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表示一对一关系,第一个参数是模型名。这种关系用的少。