day18-DjangoORM创建基本类以及生成数据库结构

本文介绍了如何在 Django 中使用 ORM 进行数据库操作,包括创建模型类、生成数据库表结构,并介绍了如何更改默认使用的数据库。

一、前言

 从今天开始我们学习DjangoORM的使用,ORM,顾名思义是 关系对象映射,从今天开始我们来学习一下 django的ORM创建基本类,以及生成数据结构。创建类步骤:

  1. 根据类自动创建数据库表
  2. 根据类对数据表中的数据进行各种操作

二、创建基本类

2.1、创建基本类

说明:在app的modles.py里面创建基本类,这些类必须继承modles.Model作为父类。注意了,这个modles.py不能更名,这个是django规定好的。

from django.db import models

# Create your models here.

#生成表名  app名_userinfo,例如app名叫 app01,则表名:app01_userinfo
class UserInfo(models.Model):
    #id是django默认帮你创建,然后默认是主键,自增长
    #列名 ,字符串类型,指定字符串的长度为32
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=64)

2.2、注册app

说明:如果想要通过python manage.py  makemigrations 找到我们所有的models,然后通过python manage.py  migrate帮我生成数据库表,就必须先注册app。这个在 project.settings.py里面install app中设置。

 

 这个加上的话,这样的话django就回去app01里面去找你的modles.py。

三、生成数据库结构

3.1、生成初始化文件

说明:我们在生成表结构之前,先要生成初始化文件,需要执行 python manage.py  makemigrations,去找我们注册号的app01。

python manage.py  makemigrations   # python manage.py makemigrations app01 初始化某个app的文件

这个需要在终端执行:

执行完毕了之后会在app01的makemigrations生成一个0001_initial.py文件,这个文件记录着你生成数据库表结构的一些记录。

3.2、生成数据库结构

说明:然后我们执行python manage.py  migrate,把这个记录生成数据库表结构。

python manage.py  migrate

 如图:

四、更改数据库

django默认使用的数据库是sqlite3,如果你想改成mysql或者其他数据库的话,需要则在project的settings.py文件中修改DATABASES.

 

这个通过 https://docs.djangoproject.com/en/2.0/ref/settings/#databases说明改成:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydatabase',  #注意了,这个数据库名django不能创建,你自己需要先创建数据库
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

这边用mysql数据库的时候注意了 :

django默认使用MySQLdb模块连接mysql。但是在python3中没有这个模块只有python2中有这个模块,python3只有pymysql模块,所以我们需要主动修改为pymsql:

在project同名文件下的__init__.py文件中添加如下代码即可:

import pymysql

pymysql.install_as_MySQLdb()

如图:

当然初始化这个python3,是没有的,需要自己安装,安装如下:

pip install pymysql

 

转载于:https://www.cnblogs.com/zhangqigao/articles/8528296.html

<think>好的,我现在需要帮助用户解决使用Django ORM查询本年度第一天至今的累计数据并求和的问题。首先,我得理解用户的具体需求。用户想从MySQL数据库中获取从今年第一天到当前日期的数据,并对某个字段进行求和。这可能用于统计年度至今的销售额、用户活跃度等指标。 接下来,我需要回忆Django ORM的相关知识。首先,处理日期范围查询通常会用到`filter()`方法,结合日期字段的过滤条件。例如,使用`date__range`来指定开始和结束日期。然后,求和操作需要用到聚合函数`Sum`,这属于Django的聚合查询部分,需要从`django.db.models`导入`Sum`。 然后,确定如何获取本年度的第一天。Python中可以使用`datetime`模块来获取当前年份的第一天。例如,`datetime.date.today().replace(month=1, day=1)`会得到当前年份的1月1日。而结束日期就是当前日期`datetime.date.today()`。 接下来,将这些条件组合到ORM查询中。模型假设为`YourModel`,日期字段为`date_field`,要求和数值的字段为`value_field`。那么查询集应该是先过滤日期在年初至今的范围,然后使用`aggregate()`方法进行求和。 还需要考虑时区的问题。如果Django设置中启用了时区支持,可能需要使用`timezone.now()`代替`datetime.date.today()`,以确保日期正确。不过用户提到使用MySQL,而Django通常处理时区转换,但用户可能需要根据实际情况调整。 另外,检查用户提供的引用内容。引用[2]提到了聚合查询需要导入`Sum`,引用[4]提到查询集的延迟执行和缓存,引用[3]关于F对象可能暂时不需要,但用户的问题中没有涉及字段比较。引用[5]提到ORM在复杂查询中的优势,这里的情况相对简单,但ORM依然适用。 可能的错误点包括:日期范围的正确格式,确保字段名称正确,以及聚合函数的使用是否正确。此外,如果数据库中没有符合条件的数据,`Sum`会返回`None`,可能需要处理这种情况,比如使用`Coalesce`函数来设置默认值0。 最后,生成示例代码,并确保语法正确。例如: from django.db.models import Sum from datetime import date start_date = date.today().replace(month=1, day=1) end_date = date.today() result = YourModel.objects.filter( date_field__range=(start_date, end_date) ).aggregate(total=Sum('value_field')) 这样,`result['total']`就是求和的结果。如果用户需要进一步处理,比如按天分组求和,可能需要使用`annotate()`和`values()`,但用户的问题中只需要总和。 总结步骤:导入相关模块,确定日期范围,构建查询集过滤,应用聚合函数求和。同时,提醒用户注意字段名称和时区设置,确保查询准确。</think>### 解决方案 使用Django ORM查询本年度第一天至今的累计数据并求和,可以通过以下步骤实现: 1. **导入所需模块** 从`django.db.models`导入聚合函数`Sum`,并获取当前日期: ```python from django.db.models import Sum from datetime import date ``` 2. **确定日期范围** 计算本年度第一天和当前日期: ```python start_date = date.today().replace(month=1, day=1) # 本年度第一天 end_date = date.today() # 当前日期 ``` 3. **构建查询集并求和** 假设您的模型名为`YourModel`,日期字段为`date_field`,数值字段为`value_field`: ```python result = YourModel.objects.filter( date_field__range=(start_date, end_date) ).aggregate(total=Sum('value_field')) ``` 结果`result['total']`即为累计求和值。若没有匹配数据,则返回`None`[^2]。 --- ### 完整代码示例 ```python from django.db.models import Sum from datetime import date from your_app.models import YourModel # 替换为实际模型路径 # 获取日期范围 start_date = date.today().replace(month=1, day=1) end_date = date.today() # 查询并求和 total = YourModel.objects.filter( date_field__range=(start_date, end_date) ).aggregate(total=Sum('value_field')).get('total', 0) print(f"本年度累计值:{total}") ``` --- ### 注意事项 1. **字段名称匹配** 确保`date_field`和`value_field`实际模型字段名称一致。 2. **时区处理** 若Django启用了时区(`USE_TZ=True`),需使用`timezone.now()`代替`date.today()`[^4]。 3. **空值处理** 可通过`Coalesce`设置默认值避免`None`: ```python from django.db.models import Coalesce result = YourModel.objects.filter(...).aggregate( total=Coalesce(Sum('value_field'), 0) ) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值