Django:模型访问

Manager属性

  Manager是Django模型最重要的属性,通过使用Manager模型才可以操作数据库。默认情况下,Django会为每一个模型提供一个名为objects的Manager实例。Manager属性只能通过模型类访问。

自定义Manager类

1
2
3
4
5
6
7
8
class Blog(models.Model):
'''模型的定义'''
name = models.CharField(max_length=100)
tagline = models.TextField()
blog = models.Manager()

def __str__(self):
return self.name

上例中的blog = models.Manager()自定义Manager类(之前的情况是不加这一句的),可以通过Blog.blog.all()查询数据,返回的结果是:

1
<QuerySet [<Blog: Beatles Blog>, <Blog: Scott Blog>]>

改进一下:

1
2
3
qs = Blog.blog.all()
for b in qs:
print(b.name)

返回的结果是:

1
2
Beatles Blog
Scott Blog

执行SQL语句

  1. Manager.raw()
    语法:Manager.raw(raw_query, params=None, translations=None)
    针对同样的Blog模型
    例:
    1
    2
    3
    blogs = Blog.blog.raw("select * from tst_blog")  # 第一个blog是我在模型中将Manager()命名为blog,tst_blog是表
    for b in blogs:
    print(b.name)

输出结果:

1
2
Beatles Blog
Scott Blog

注意:如果不能返回数据则会抛出异常

  1. django.db.connection
      django.db.connection对象提供了数据库连接操作,使用connection.cursor()方法可以得到一个游标对象,cursor.execute(sql,[paramas])方法用于执行指定的SQL语句。使用cursor.fetchone()或者cursor.fetchall()方法可以得到一个或全部结果。

    表与表之间的关系

    多对一

      在关系型数据库中通常使用外键来表示多对一关系,Django模型中的ForeignKey字段就是模型的外键,写在“多”的那个模型下,其第一个参数对应相关联的类,例如一个问题可以有多个选项:
    1
    2
    3
    4
    5
    class 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中的外键查询Question

1
2
c = Choice.objects.get(pk=1)
c.question

反向查询:通过Question查询Choice

1
2
q = Question.objects.get(pk=1)
q.choice_set.all()

多对多

  假设公司里一个员工属于一个或多个部门,每个部门有一个或多个员工,为了实现该组织架构,使用ManyToManyField字段类型:

1
2
3
4
5
6
class 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
2
d = Department.objects.get(id=3)
d.Employee_set.all()

一对一

  使用OneToOneField表示一对一关系,第一个参数是模型名。这种关系用的少。