Dajngo数据模型

1.定义models

每个模型使用python的一个类表示,并且是django.db.models.Model的子类:

from django.db import models
class XXX(models.Model):

2.安装模型

目录:settings-INSTALLED_APPS
命令:

  • 验证模型:python manage.py check
  • 生成迁移:python manage.py makemigrations
  • 执行迁移:python manage.py migrate
  • 使用shell测试模型:python manage.py shell

3.model管理器

objects是Django模型用于执行数据库查询的对象,一个Django模型至少有一个管理器,同时可以自定义管理器,定制访问数据库的方式。自定义管理器可能处于两方面的原因:添加额外的管理器方法和修改管理器返回的QuerySet。

  • 添加额外的管理器方法
class BookManager(models.Manager):
    def title_count(self, keyword):
       return self.filter(title__icontains=keyword).count()
class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()
    num_pages = models.IntegerField(blank=True, null=True)
    objects = BookManager()

    def __str__(self):
        return self.title
# 调用
Book.objects.title_count(keyword)
  • 修改管理器返回的QuerySet

    注意:Django把它解释的第一个管理器定义为“默认”管理器,之后很多地方只使用那个管理器

"""
Book.objects.all() 返回数据库中的所有图书,而Book.dahl_objects.all() 只返回Roald Dahl 写的书
"""
# 首先,定义 Manager 子类
class DahlBookManager(models.Manager):
    def get_queryset(self):
    # 超类 super(class_name, self).def_name(*args, **kwargs),确保把对象保存到数据库中。如果忘记,默认的行为不会发生,根本不会触及数据库
       return super(DahlBookManager, self).get_queryset().filter(author='Roald Dahl')
# 然后,放入 Book 模型
class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)
    # ...
    objects = models.Manager() # 默认的管理器
    dahl_objects = DahlBookManager() # 专门查询 Dahl 的管理器

# 调用
Book.dah1_objects.all()
Book.dah1_objects.filter()
Book.dah1_objects.count()
Book.objects.all()

4.模型方法

管理器的作用是执行数据表层的操作,而模型方法处理的是具体的模型实例。包括:

  • 自带模型方法

str():返回对象的 Unicode 表示形式 在交互式控制台或管理后台中显示对象调用的都是这个方法。

get_absolute_url():这个方法告诉 Django 如何计算一个对象的 URL。Django 在管理后台和需要生成
对象的 URL 时调用这个方法。具有唯一标识的 URL 的对象都要定义这个方法。

  • 自定义模型方法:在所设计的模型类中加入自定义函数方法即可
import datetime
class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    birth_date = models.DateField()
    def baby_boomer_status(self):
        if self.birth_date < datetime.date(1945, 8, 1):
            return "Pre-boomer"
        elif self.birth_date < datetime.date(1965, 1, 1):
            return "Baby boomer"
        else:
            return "Post-boomer"
    def _get_full_name(self):
        # 返回一个人的全名
        return '%s %s' % (self.first_name, self.last_name)
    full_name = property(_get_full_name)
  • 覆盖预定义的模型方法
class Blog(models.Model):
     name = models.CharField(max_length=100)
     tagline = models.TextField()
     def save(self, *args, **kwargs):
        do_something()
        super(Blog, self).save(*args, **kwargs) # 调用“真正的”save () 方法
        do_something_else()

5.数据操作

参考:QuerySet API 参考¶

  • 检索数据:get()、all()…

  • 过滤数据:filter()、exclude()…

  • 排序数据:order_by(“字段”,) 常常包含在 class Meta:

  • 链式操作:objects.filter(**kwargs).order_by()/delete()/save()…

  • 数据切片:order_by()[0:5] 不支持负数…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值