Django模型models的使用和查询

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   

  

 

转载于:https://www.cnblogs.com/LuoDa/p/5404259.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值