Django实现数据表数据操作

1. Django实现数据表数据插入(创建Model实例)

1.1 save方法创建Model实例

from index.models import Book #导入相关model类
#创建Book实例化对象
book=Book(title="Python",public="a",price="59.00",retail_price="59.00")
book.save()# 调用save方法进行保存
book=Book(title="Flask",public="b",price="39.00",retail_price="39.00")
book.save()# 调用save方法进行保存
book=Book(title="Django",public="b",price="40.00",retail_price="40.00")
book.save()# 

1.2 create方法创建Model实例 

In [1]: Book.objects.create(title="Java",public="a",price="30.00",retail_price="30.00")
Out[1]: <Book: title:Java public:a price:30.00> #执行create方法存在返回值

2. Django实现数据表数据删除

delete()

delete()是唯一没有在管理器上暴露出来的方法。这是刻意设计的一个安全机制,用来防止你意外地请求类似Article.objects.delete()的动作,而不慎删除了所有的条目。如果你确实想删除所有的对象,你必须明确地请求一个完全的查询集,像下面这样:

Article.objects.all().delete()

3. Django实现数据表数据修改

3.1 普通字段修改,直接赋值

    value = Account.objects.all()[0]
    value.username =  '被修改的username,改' + str(random.randrange(1, 100))
    value.save()

3.2 数字字段计算,用 F 

    article = Article.objects.filter()[1]
    # 有一种常见的需求是根据现有字段的值,更新成为新的值,比如阅读数+1的操作,要用F对象
    article.read_count = F('read_count') + 1

3.3 外键修改

    # 保存一个外键字段和保存普通字段没什么区别,只是要注意值的类型要正确。
    account = Account.objects.filter(username = 'pVDAmzMk')[0]
    article.account = account
    article.save()

3.4 多对多字段的修改

remove,add,set,clear,create

    # 多对多字段的修改,稍微有点区别,需要调用一个add()、remove()方法,而不是直接给属性赋值,但它不需要调用save方法。
    tag1 = Tag.objects.get(name = '天文')
    tag2 = Tag.objects.get(name = '地理')
    tag3 = Tag.objects.get(name = '水利')

    # 移除
    article.tags.remove(tag1, tag2)
    # 添加
    article.tags.add(tag1)
    
    article = Article.objects.get(title = '文章4')
    # 清除
    article.tags.clear()
    # 重新批量设置
    article.tags.set([tag2, tag3])
    # 创建并添加
    tag4 = article.tags.create(name = '农耕')

3.5 批量更新字段值,(是比较常用的)

update,只可以对普通字段和ForeignKey字段使用这个方法。若要更新一个普通字段,只需提供一个新的常数值。若要更新ForeignKey字段,需设置新值为你想指向的新模型实例。

    # 所有8月24日之后创建的文章,阅读量都加1, 修改文章内容,修改作者。
    account = Account.objects.get(username = '30ry9WGC')
    Article.objects.filter(pub_date__gte = '2021-8-25').update(read_count = F('read_count') + 1, content = '12316546', account = account)

 若要对多对多字段进行批量更新,有什么办法?只能遍历filter里的所有实例?

4. Django实现数据表数据查询

get、all、fitler、exclude、order_by、get_or_create

一、get函数(仅能返回一条数据)。

book = BookInfo.objects.get(id__exact = 1)   # 可以且仅可以返回一条数据。 没有数据或返回多条数据都会抛异常。

book = BookInfo.objects.get(id = 1)   # 简写形式。  __exact可以省略。返回模型对象

二、all函数 (查询所有)

books = BookInfo.objects.all()   # 查询所有。 返回QuerySet查询集(可以遍历)

三、filter函数 (条件查询)

# 条件查询。(可以通过逗号,连接多个条件)  返回QuerySet查询集(可以遍历)

books = BookInfo.objects.filter(title__exact = '天龙八部')  # __exact 等于。 __exact 可以省略。 (__iexact 不区分大小写)

books = BookInfo.objects.filter(title__contains = '天')  # __contains 包含。模糊查询。 (__icontains 不区分大小写)

books = BookInfo.objects.filter(title__endswith = '部')  # __endswith 以..结尾。 __startswith 以..开头。 (__iendswith 不区分大小写)

books = BookInfo.objects.filter(title__isnull = False)  # __isnull 是否为空。 True:表示为null。 False表示not null。

books = BookInfo.objects.filter(id__in = [1,3,5])  # __in 范围查询。

books = BookInfo.objects.filter(id__gt = 3)  # __gt 大于。 __lt 小于。 __gte 大于等于。 __lte 小于等于。

books = BookInfo.objects.filter(pub_date__gt = date(1980,1,1))  # 日期查询。

books = BookInfo.objects.filter(pub_date__year = 1980)   # 日期查询。(year、month、day、week_day、hour、minute、second)

四、exclude函数 (filter函数取反)

# 查询id不为3的所有图书。

books = BookInfo.objects.exclude(id = 3)  # 与filter函数作用相反。 返回QuerySet查询集(可以遍历)

五、order_by函数 (排序)

# 对查询结果进行排序。 返回QuerySet查询集(可以遍历)

books = BookInfo.objects.all().order_by('-id')   # 'id'表示升序; '-id'表示降序。

books = BookInfo.objects.order_by('-id', 'name')    #  .all()可以省略。 默认查询所有。 可以结合filter等函数一起使用 。

六、跨表查询

    response1 = '跨表查询' + '<br>'
    list = Article.objects.filter(account__username = '7JKSxF8L')
    for value in list:
        response1 += 'title:' + value.title + '<br>' + 'content:' + value.content + '<br>' + 'account.username:' + value.account.username + '<br>'


    response2 = '跨表查询,多字段,and查询' + '<br>'
    list = Article.objects.filter(account__email__contains = '@123.com', account__register_date__lte = '2021-02-20')
    for value in list:
        response2 += 'title:' + value.title + '<br>' + 'content:' + value.content + '<br>' + 'account.username:' + value.account.username + '<br>'

七、F表达式,

字段和字段的比较。

    response3 = 'F查询' + '<br>'
    list = Article.objects.filter(account__register_date__lt = F('pub_date'))
    for value in list:
        response3 += 'title:' + value.title + '<br>' + 'content:' + value.content + '<br>' + 'account.username:' + value.account.username + '<br>'

七、Q对象,解决多条件,或 与 非问题,& | ~

    response4 = 'Q查询' + '<br>'
    list = Article.objects.filter(Q(account__email__contains = '@1234.com') | Q(account__register_date__lte = '2021-02-20'))
    for value in list:
        response4 += 'title:' + value.title + '<br>' + 'content:' + value.content + '<br>' + 'account.username:' + value.account.username + '<br>'

当关键字参数和Q对象组合使用时,Q对象必须放在前面,如下例子:

    response4 = 'Q查询' + '<br>'
    list = Article.objects.filter(Q(account__email__contains = '@1234.com') | Q(account__register_date__lte = '2021-02-20'), pub_date__gt = '2021-08-16')
    for value in list:
        response4 += 'title:' + value.title + '<br>' + 'content:' + value.content + '<br>' + 'account.username:' + value.account.username + '<br>'

八、可通过对象查询

    # 可通过对象进行查询,以下3种方式效果一样
    list = Article.objects.filter(tags = tag1)
    list = Article.objects.filter(tags = tag1.id)
    list = Article.objects.filter(tags = 1)

九、get_or_create函数 (查询或创建)

通过kwargs来查询对象的便捷方法(如果模型中的所有字段都有默认值,可以为空),如果该对象不存在则创建一个新对象

该方法返回一个由(object, created)组成的元组,元组中的object 是一个查询到的或者是被创建的对象, created是一个表示是否创建了新的对象的布尔值。

    # 创建 or 添加
    # 方法一
    list = Tag.objects.filter(name = '贸易')
    if len(list) == 0:
        tag4 = article.tags.create(name = '贸易')

    # 方法二
    tag4, created = Tag.objects.get_or_create(name = '贸易')

5. Django实现复制模型实例

最简单的方法是将原实例的pk设置为None

    article = Article.objects.filter()[0]
    article.pk = None
    article.save()

6. 可以通过.through属性访问您的m2n关系的穿透模型

    through_model = Article.tags.through
    response6 = 'through_model' + '<br>'
    list = through_model.objects.all()
    for value in list:
        response6 += 'article_id:' + str(value.article_id) + '---' + 'tag_id:' + str(value.tag_id) + '<br>'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值