from django.db import models
class TableName(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
date = models.DateField()
def __unicode__(self): #__str__ python3.x
return self.name
class Meta:
#不加Meta类的话,表名为“AppName_TableName”,按下列加的话表明为TableName
db_table = "TableName"
#一个 DateField 或 DateTimeField 字段的名字. 若提供该选项, 该模块将拥有一个 #get_latest() 函数以得到 "最新的" 对象(依据那个字段):
get_latest_by = "date"
使用mysql。在setting.py中修改相应设置
进入mysql新建数据库mysite(对应NAME)
然后在project目录中
>>>python manage.py makemigrations
>>>python manage.py migrate
同步数据库,自动创建表TableName
对数据库进行修改后也要如上同步数据库
数据库的修改:
(1)在终端进行操作
>>>python manege.py shell
>>>from App_Name.models import TableName
>>>TableName.objects.create(name='name',age=age,date='YYYY-MM-DD')
(2)在文件中加入TableName.objects.create(name='name',age=age,date='YYYY-MM-DD')进行添加。
(3)直接执行mysql语句
django.db.connection:代表默认的数据库连接
django.db.transaction:代表默认数据库事务(transaction)
用database connection调用 connection.cursor() 得到一个游标(cursor)对象。
然后调用 cursor.execute(sql, [params]) 执行SQL
cursor.fetchone() 或者 cursor.fetchall(): 返回结果行
如果执行修改操作,则调用 transaction.commit_unless_managed()来保证你的更改提交到数据库。
def my_custom_sql():
from django.db import connection, transaction
cursor = connection.cursor()
# 数据修改操作——提交要求
cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
transaction.commit_unless_managed()
# 数据检索操作,不需要提交
cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
row = cursor.fetchone()
return row
接下来说一说filter的用法。
django中查询返回的结果是一个QuerySet querySet.distinct() 去重复
以上边models中的表TableName为例:
TableName.objects.all() 返回一个QuerySet
TableName.object.get(name="ld") 返回一个对象,name="ld" 只返回一个对象
TableName.objects.filter(age__it=24) 返回一个QuerySet。其中age都小于24
filter中参数的各种方法:
__exact 精确等于 like 'aaa'
__iexact 精确等于 忽略大小写 ilike 'aaa'
__contains 包含 like '%aaa%'
__icontains 包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。
__startwith 以什么开头 __istartwith(忽略大小写)
__endwith 以什么结尾 __iendwith(忽略大小写)
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__startswith 以...开头
__istartswith 以...开头 忽略大小写
__endswith 以...结尾
__iendswith 以...结尾,忽略大小写
__range 在...范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False
filter查询的结果还是一个QuerySet,所以还可以进行链式的filter,比如:
Entry.objects.filter(headline__startswith='What'
).exclude(pub_date__gte=datetime.date.today()
).filter( pub_date__gte=datetime(2005, 1, 30))
QuerySet只有在取值的时候才开始查询。比如:
q = Entry.objects.filter(headline__startswith="What")
q = q.filter(pub_date__lte=datetime.date.today())
q = q.exclude(body_text__icontains="food")
print(q)
在print的时候才与数据库进行交互。而不是进行了3次查询。
exclude()的用法和filter相似(在有多个查询条件的时候不一样)。含义与filter相反。即取不符合exclude()内条件的查询集合。
用python中切片的方法可以实现数据库中 limit+offset 的效果(从第offset位开始取limit条数据)如:
Entry.objects.all()[:5] # 等价于 limit 5
注意:不同于python的切片,下边语句是取第6-10条(而不是第5-9条) 而且不支持负的索引值(Entry.objects.all()[-1] )
Entry.objects.all()[5:10] # 等价于 offset 5 limit 5