#使用 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_date
和 comments_on
。)
你可以更新多个字段——没有数量限制。例如,这里我们更新了 comments_on
和 headline
字段:
>>> 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_save
或 post_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'