表名
- 获取表名
UserData._meta.db_table
- 自定义表名
class UserData(models.Model):
...
class Meta:
db_table = "user_data"
查询条件
- filter() : 选择条件
- exclude() : 排除条件
__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
group by
python:
UserData.objects
.filter(hubid=sensorid,time__range=(time2,time1))
.values('hour')
.annotate(sum_out=Sum('outdoor'), sum_in=Sum('indoor'), sum_eat=Sum('kitchen'), sum_wash=Sum('toilet'))
.order_by('hour')
sql:
select Sum('outdoor') as sum_out
,Sum('indoor') as sum_in
,Sum('kitchen') as sum_eat
,Sum('toilet') as sum_wash
,hour
from user_data
where hubid='sensorid' and (time between time1 and time2)
group by hour
order by hour asc
Q
or,and 查询
ref: http://codingdict.com/sources/py/django.db.models/3914.html
migrate
将工程 migrations/ 下的文件删除之后, 再次做 makemigrations & migrate 的时候可能有问题:e.g. django.db.utils.OperationalError: table "app_info" already exists
, 或者根本没有任何动作
- 打开db, 查 django_migrations 表
这些记录与migrations 一一对应,已经记录了的就不会再做12|auth|0008_alter_user_username_max_length|2020-01-22 08:52:36.648872 13|sessions|0001_initial|2020-01-22 08:52:36.658063 14|dashboard|0001_initial|2020-01-22 08:59:28.387304 15|dashboard|0002_auto_20200130_1807|2020-01-30 10:13:54.872818 16|dashboard|0003_appvisitinfodaily|2020-02-04 13:04:15.575447
- 看一个 0001_initial py 文件
就是一些migrations 文件的依赖关系,DDL 的操作class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='AppInfo', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('app_name', models.CharField(max_length=64)), ], options={ 'db_table': 'app_info', }, ),
机制清楚了, 那就是把 db里的记录, 和文件内容对应上就行了, 如 删除一些 db 里的记录,这样对应的 migration py 就可以做重,也可以配合修改migration py 使达到目的
注意: django migrate 并不是原子操作, 可能出现: 表创建完成,但索引没有建立,django_migrations 中没有migration文件记录的异常情况。
shell
可以用 python manager.py shell 创建 一个django 的终端。在里面可以
from django.db import connection
cursor = connection.cursor()
cursor.execute('select * from .....')