资讯专栏INFORMATION COLUMN

Django的models模型

caozhijian / 969人阅读

摘要:大于大于等于小于小于等于存在于一个范围内以开头以开头忽略大小写以结尾以结尾,忽略大小写在范围内日期字段的年份日期字段的月份日期字段的日

model的常用字段
V=models.CharField(max_length=None[, **options])    #varchar
V=models.EmailField([max_length=75, **options])    #varchar
V=models.URLField([verify_exists=True, max_length=200, **options])    #varchar
V=models.FileField(upload_to=None[, max_length=100, **options])    #varchar
#upload_to指定保存目录可带格式,
V=models.ImageField(upload_to=None[, height_field=None, width_field=None, max_length=100, **options])
V=models.IPAddressField([**options])    #varchar
V=models.FilePathField(path=None[, match=None, recursive=False, max_length=100, **options]) #varchar
V=models.SlugField([max_length=50, **options])    #varchar,标签,内含索引
V=models.CommaSeparatedIntegerField(max_length=None[, **options])    #varchar
V=models.IntegerField([**options])    #int
V=models.PositiveIntegerField([**options])    #int 正整数
V=models.SmallIntegerField([**options])    #smallint
V=models.PositiveSmallIntegerField([**options])    #smallint 正整数
V=models.AutoField(**options)    #int;在Django代码内是自增
V=models.DecimalField(max_digits=None, decimal_places=None[, **options])    #decimal
V=models.FloatField([**options])    #real
V=models.BooleanField(**options)    #boolean或bit
V=models.NullBooleanField([**options])    #bit字段上可以设置上null值
V=models.DateField([auto_now=False, auto_now_add=False, **options])    #date
#auto_now最后修改记录的日期;auto_now_add添加记录的日期
V=models.DateTimeField([auto_now=False, auto_now_add=False, **options])    #datetime
V=models.TimeField([auto_now=False, auto_now_add=False, **options])    #time
V=models.TextField([**options])    #text
V=models.XMLField(schema_path=None[, **options])    #text
——————————————————————————–
V=models.ForeignKey(othermodel[, **options])    #外键,关联其它模型,创建关联索引
V=models.ManyToManyField(othermodel[, **options])    #多对多,关联其它模型,创建关联表
V=models.OneToOneField(othermodel[, parent_link=False, **options])    #一对一,字段关联表属性
经典情景示例

书籍,作者,出版社之间的关系,这里为了便于演示,我们尽量精简了表中的字段,书籍表具有书名,出版社同出版社表建立一对多的关系[foreign key],一本书可以具有多个作者,又同作者表建立多对多的关系[many-to-many],作者表有名称,年龄,出版社表有出版社名称。

from django.db import models
class Publisher(models.Model):
    name = models.CharField(max_length=30)
 
    def __str__(self):
        return self.name
 
class Author(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()
 
    def __str__(self):
        return self.name
 
class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher,on_delete=models.CASCADE)
 
    def __str__(self):
        return self.title
选择对象

获取全体对象

Publisher.objects.all() #获取所有对象

筛选对象

Publisher.objects.filter(name="人们教育出版社") #获取的是一个对象列表
dict = {"name":"lemon","age":18}
Author.objects.filter(**dict) #列表传参的方法

获取单个对象

Publisher.objects.get(name="机械工业出版社") #找不到会报错!!!

对象排序

Author.objects.order_by("name","-age") #可以按照多个字段排序,- 表示逆向排序

连查

Author.objects.filter(name="lemon").order_by("-age")[0] 

批量更新

Author.objects.all().update(age="18")

删除对象

Author.objects.filter(name="lemon").delete()
外键和多对多操作

访问外键

Book.objects.get(id=1).publisher #得到书籍的出版社

反向查询

models.Publisher.objects.get(id=1).book_set.all() #反向查询,得到的是一个queryset对象列表

多对多操作

Book.objects.get(id=1).authors.all() #得到queryset对象列表
自定义models方法
class Author(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()

    def __str__(self):
        return self.name
    def status(self):
        if self.name=="lemon":
            return "帅哥"

运行结果:

aa = models.Author.objects.get(id=1)
print(aa.status())
———————————————运行结果——————————————————
帅哥
自定义manager管理器
class AuthorManager(models.Manager):
    def name_count(self,str_name):
        return self.filter(name__icontains=str_name).count()
class Author(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()

    def __str__(self):
        return self.name
    def status(self):
        if self.name=="lemon":
            return "帅哥"
    #一旦定义了新的管理器,默认管理器需要显示声明出来才可以使用
    objects = models.Manger() #默认管理器
    object=AuthorManager() #新定义管理器

执行结果:

aa = models.Author.object.name_count("lemon")
print(aa) #——————》2
自定义sql语句
class AuthorManager(models.Manager):
    def age_stat(self, age_int):
        cursor = connection.cursor()
        cursor.execute("""
            SELECT NAME
            FROM app2_author
            WHERE age = %s""", [age_int])
        #fetchall()返回的是元组的列表
        return [row[0] for row in cursor.fetchall()]
        
class Author(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()
    # objects =models.Manager()
    object=AuthorManager()
    def __str__(self):
        return self.name

执行结果:

aa = models.Author.object.age_stat(18)
print(aa)
-----------------
["lemon", "Luouo"]
过滤字段的方法
__exact 精确等于 like "aaa"
 __iexact 精确等于 忽略大小写 ilike "aaa"
 __contains 包含 like "%aaa%"
 __icontains 包含 忽略大小写 ilike "%aaa%",但是对于sqlite来说,contains的作用效果等同于icontains。
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__startswith 以...开头
__istartswith 以...开头 忽略大小写
__endswith 以...结尾
__iendswith 以...结尾,忽略大小写
__range 在...范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45154.html

相关文章

  • Django搭建个人博客:编写博客文章Model模型

    摘要:在里写一个数据库驱动的应用的第一步是定义模型,也就是数据库结构设计和附加的其它元数据。模型元数据是任何不是字段的东西,例如排序选项数据库表名单数和复数名称和。 Django 框架主要关注的是模型(Model)、模板(Template)和视图(Views),称为MTV模式。 它们各自的职责如下: 层次 职责 模型(Model),即数据存取层 处理与数据相关的所有事务: 如何存取...

    winterdawn 评论0 收藏0
  • Python学习之路17-Django入门

    摘要:编程从入门到实践笔记。执行命令后,项目的根目录下会多出一个名为的数据库文件。下面创建一个主题类用户学习的主题返回模型的字符串表示类是中的一个定义了模型基本功能的类。这种交互式环境称为,常用语测试项目和排除故障。 《Python编程:从入门到实践》笔记。从本篇开始将是该书的最后一个项目,将用3篇文章来介绍Django的基础。完成一个学习笔记的小网站。 1. 前言 在本篇中,我们将: 用...

    shadowbook 评论0 收藏0
  • Django 博客开发教程 3 - 创建 Django 博客数据库模型

    摘要:而对于标签来说,一篇文章可以有多个标签,同一个标签下也可能有多篇文章,所以我们使用,表明这是多对多的关联关系。理解多对一和多对多两种关联关系我们分别使用了两种关联数据库表的形式和。表明一种一对多的关联关系。 设计博客的数据库表结构 博客最主要的功能就是展示我们写的文章,它需要从某个地方获取博客文章数据才能把文章展示出来,通常来说这个地方就是数据库。我们把写好的文章永久地保存在数据库里,...

    Shimmer 评论0 收藏0
  • Django Model View Template 之间简单交互 (二)

    摘要:当然还有其他高级的使用,日后再说完整的用户名邮箱联系地址留言信息用户留言信息使用之前已经定义好了数据模型的字段元数据方法等。 前言 接续前文,上一篇文章主要涉及了 Django 项目的基础配置等,这篇主要涉及数据库相关的 ORM ,也就是 Django 中的 Model 的使用,MVT 三层之间的交互 教程基本都是东拼西凑的,防止有些东西表述不准确,因为我之前写 JavaScript ...

    Coding01 评论0 收藏0
  • Django基础之六(模型理论知识)

    摘要:在模型中添加是完全可选的,所有选项都不是必须的。一个模型的数据库表名称,由这个模型的应用名和模型类名称之间加上下划线组成。使用来表示随机排序。默认值为这个选项为时可以对数据库表进行或删除等操作。 Django模型理论知识 简介 Django模型所在的位置: URL--->视图--->模型(mysql) 什么是模型: 模型就是数据的唯一的&权威的信息源 包含所存储的诗句的必要字段和...

    lmxdawn 评论0 收藏0

发表评论

0条评论

caozhijian

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<