django学习小笔记

#使用 HttpResponse 代替 JsonResponse 解决JsonResponse返回中文乱码的问题
import jsonfrom django.shortcuts
import HttpResponsefrom django.http 
import JsonResponsefrom databases_models 
import modelsdef get(request):    
    publish_list = models.Publish.objects.all()    
    bs = MySer.PublishSerializer(publish_list, many=True)    
    #return JsonResponse(bs.data, safe=False, )   
    return HttpResponse(json.dumps(bs.data,ensure_ascii=False),content_type='application/json')
# 当返回的中文是乱码时,这时由于ascii码的原因,JsonResponse()在初始化的时候使用了json.dumps()把字典转换成了json格式
# 当ensure_ascii是false的时候,可以返回ASCII码的值,否则就会被JSON转义
# 所以含有中文的字典转json字符串时,使用json.dumps()方法要把ensure_ascii参数修改成false
# content_type是指定MIME类型和编码,这样客户端知道主体是什么类型的资源,才能调用相应的插件或内置的程序去处理

django中解决CSRF问题

1. 项目的settings.py中包含 django.middleware.csrf.CsrfViewMiddleware 这个中间件
2. 每次在模板里写 form 时都知道要加一个 {% csrf_token %} 
3. 每次发 ajax POST 请求,都需要加一个 X_CSRFTOKEN 的 header
4. 使用render函数,不要使用render_to_response函数

django中数据库的数据提取问题

models.User.objects.filter(username=username, password=password).first()

这个就是很典型的数据库提取数据问题:

当我们从数据库提取数据的时候 他返回给我们的是一个queryset的一个列表,我们要用循环的办法才能从里面拿出数据

现在我有一个比较ok的办法就是在后面加上一个first方法这一样子他就会自己拿出符合fiter条件的第一个数据了

提取数据的几种办法

models.User.objects.filter(username=username, password=password).first()  #这个是拿符合条件的数据
models.User.objects.get(pk=1).first()  #这个是只能拿一个
models.User.objects.all()   #这个是拿全部数据




first()
  • first()[¶](https://docs.djangoproject.com/zh-hans/3.2/ref/models/querysets/#django.db.models.query.QuerySet.first

返回查询集匹配的第一个对象,如果没有匹配的对象,则返回 None。如果 QuerySet 没有定义排序,那么查询集自动按主键排序。这可能会影响聚合结果,如 Interaction with order_by() 中所述。

举例:

p = Article.objects.order_by('title', 'pub_date').first()

请注意,first() 是一个方便的方法,下面的代码示例相当于上面的例子:

try:
    p = Article.objects.order_by('title', 'pub_date')[0]
except IndexError:
    p = None
Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3), headline='Hello')  #将数据排除在外
SELECT ...
WHERE NOT (pub_date > '2005-1-3' AND headline = 'Hello')
#排序
Entry.objects.filter(pub_date__year=2005).order_by('-pub_date', 'headline')  
#上述结果将按 pub_date 降序排列,然后按 headline 升序排列。"-pub_date" 前面的负号表示 降序。升序是隐含的。要随机排序,使用 "?",如:
Entry.objects.order_by('?')

保存数据

create()
  • create(**kwargs)

一种方便的方法,用于创建一个对象并一步到位地保存。 因此:

p = Person.objects.create(first_name="Bruce", last_name="Springsteen")

和:

p = Person(first_name="Bruce", last_name="Springsteen")
p.save(force_insert=True)

是等效的。

force_insert 参数在其他地方有说明,但它的意思是总是会创建一个新的对象。通常情况下,你不需要担心这个问题。但是,如果你的模型中包含了一个你设置的手动主键值,而且如果这个值已经存在于数据库中,那么对 create() 的调用就会以一个 IntegrityError 失败,因为主键必须是唯一的。如果使用手动主键,要做好处理异常的准备。

更新数据

update()
  • update(**kwargs)

对指定的字段执行 SQL 更新查询,并返回匹配的行数(如果有些行已经有了新的值,则可能不等于更新的行数)。

例如,要关闭 2010 年发表的所有博客条目的评论,你可以这样做:

>>> Entry.objects.filter(pub_date__year=2010).update(comments_on=False)

(假定你的 Entry 模型有 pub_datecomments_on。)

你可以更新多个字段——没有数量限制。例如,这里我们更新了 comments_onheadline 字段:

>>> Entry.objects.filter(pub_date__year=2010).update(comments_on=False, headline='This is old')

update() 方法是即时应用的,对被更新的 QuerySet 唯一的限制是只能更新模型主表中的列,不能更新相关模型。你不能这样做,比如:

>>> Entry.objects.update(blog__name='foo') # Won't work!

但仍可根据相关字段进行过滤:

>>> Entry.objects.filter(blog__id=1).update(comments_on=True)

你不能在一个 QuerySet 上调用 update(),因为它已经被取走了一个片断或者不能再被过滤。

update() 方法返回受影响的行数:

>>> Entry.objects.filter(id=64).update(comments_on=True)
1

>>> Entry.objects.filter(slug='nonexistent-slug').update(comments_on=True)
0

>>> Entry.objects.filter(pub_date__year=2010).update(comments_on=False)
132

如果你只是更新一条记录,不需要对模型对象做任何事情,最有效的方法是调用 update(),而不是将模型对象加载到内存中。例如,不要这样做:

e = Entry.objects.get(id=10)
e.comments_on = False
e.save()

…要这样做:

Entry.objects.filter(id=10).update(comments_on=False)

使用 update() 还可以防止在加载对象和调用 save() 之间的短暂时间内数据库中的某些东西可能发生变化的竞争条件。

最后,要知道,update() 是在 SQL 级别上进行更新,因此,它不会在模型上调用任何 save() 方法,也不会发出 pre_savepost_save 信号(这是调用 Model.save() 的结果)。如果你想为一个有自定义 save() 方法的模型更新一堆记录,在它们上面循环并调用 save(),像这样:

for e in Entry.objects.filter(pub_date__year=2010):
    e.comments_on = False
    e.save()
Ordered queryset

New in Django 3.2.

Chaining order_by() with update() is supported only on MariaDB and MySQL, and is ignored for different databases. This is useful for updating a unique field in the order that is specified without conflicts. For example:

Entry.objects.order_by('-number').update(number=F('number') + 1)

删除数据

delete()
  • delete()

QuerySet 中的所有行执行 SQL 删除查询,并返回删除的对象数量和每个对象类型的删除数量的字典。

delete() 是即时应用的。你不能对已经被取走一个片断或不能再被过滤的 QuerySet 调用 delete()

例如,要删除某个博客中的所有条目:

>>> b = Blog.objects.get(pk=1)

# Delete all the entries belonging to this Blog.
>>> Entry.objects.filter(blog=b).delete()
(4, {'weblog.Entry': 2, 'weblog.Entry_authors': 2})

默认情况下,Django 的 ForeignKey 模拟了 SQL 约束 ON DELETE CASCADE——换句话说,任何外键指向要删除的对象的对象都会被一起删除。例如:

>>> blogs = Blog.objects.all()

# This will delete all Blogs and all of their Entry objects.
>>> blogs.delete()
(5, {'weblog.Blog': 1, 'weblog.Entry': 2, 'weblog.Entry_authors': 2})

匹配数据

iexact不区分大小写

不区分大小写的完全匹配。如果提供的比较值是 None,它将被解释为 SQL NULL (详见 isnull)。

举例:

Blog.objects.get(name__iexact='beatles blog')
Blog.objects.get(name__iexact=None)

SQL 等价于:

SELECT ... WHERE name ILIKE 'beatles blog';
SELECT ... WHERE name IS NULL;

注意第一个查询会匹配 'Beatles Blog''beatles blog''BeAtLes BLoG' 等。

contains区分大小写

区分大小写的包含测试。

举例:

Entry.objects.get(headline__contains='Lennon')

SQL 等价于:

SELECT ... WHERE headline LIKE '%Lennon%';

请注意,这将与标题 'Lennon honored today' 相匹配,而不是 'lennon honored today'

icontains包含数据

不区分大小写的包含测试。

举例:

Entry.objects.get(headline__icontains='Lennon')

SQL 等价于:

SELECT ... WHERE headline ILIKE '%Lennon%';
in

在一个给定的可迭代对象中;通常是一个列表、元组或查询集。这不是一个常见的用例,但字符串(可迭代)是可以接受的。

举例:

Entry.objects.filter(id__in=[1, 3, 4])
Entry.objects.filter(headline__in='abc')

SQL 等价于:

SELECT ... WHERE id IN (1, 3, 4);
SELECT ... WHERE headline IN ('a', 'b', 'c');

你也可以使用一个查询集来动态计算值列表,而不是提供一个字面值列表:

inner_qs = Blog.objects.filter(name__contains='Cheddar')
entries = Entry.objects.filter(blog__in=inner_qs)

该查询集将作为子选择语句执行:

SELECT ... WHERE blog.id IN (SELECT id FROM ... WHERE NAME LIKE '%Cheddar%')

如果你把一个由 values()values_list() 产生的 QuerySet 作为值传递给 __in 查找,你需要确保你只提取结果中的一个字段。例如,这样做就可以了(过滤博客名):

inner_qs = Blog.objects.filter(name__contains='Ch').values('name')
entries = Entry.objects.filter(blog__name__in=inner_qs)

这个例子会引发一个异常,因为内部查询正试图提取两个字段值,而预期只有一个:

# Bad code! Will raise a TypeError.
inner_qs = Blog.objects.filter(name__contains='Ch').values('name', 'id')
entries = Entry.objects.filter(blog__name__in=inner_qs)
gt大于。

大于。

举例:

Entry.objects.filter(id__gt=4)

SQL 等价于:

SELECT ... WHERE id > 4;
gte大于等于。

大于等于。

lt小于。

小于。

lte小于等于

小于等于

startswith

区分大小写的开头为。

举例:

Entry.objects.filter(headline__startswith='Lennon')

SQL 等价于:

SELECT ... WHERE headline LIKE 'Lennon%';

SQLite 不支持区分大小写的 LIKE 语句;startswith 的作用就像 SQLite 的 istartswith

istartswith

不区分大小写的开头为。

举例:

Entry.objects.filter(headline__istartswith='Lennon')

SQL 等价于:

SELECT ... WHERE headline ILIKE 'Lennon%';

SQLite 用户

endswith

区分大小写的结尾为。

举例:

Entry.objects.filter(headline__endswith='Lennon')

SQL 等价于:

SELECT ... WHERE headline LIKE '%Lennon';

SQLite 用户

SQLite 不支持区分大小写的 LIKE 语句;endswith 的作用类似于 SQLite 的 iendswith。更多内容请参考 database note 文档。

iendswith

不区分大小写的结尾为。

举例:

Entry.objects.filter(headline__iendswith='Lennon')

SQL 等价于:

SELECT ... WHERE headline ILIKE '%Lennon'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值