django学习小笔记


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 HttpResponse(json.dumps(bs.data,ensure_ascii=False),content_type='application/json')

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()[¶](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')

Entry.objects.order_by('?')

保存数据

  • 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(** 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')
>>> Entry.objects.update(blog__name='foo') # Won't work!

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

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

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()

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()

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

>>> 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})

匹配数据

举例:

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' 等。

区分大小写的包含测试。

举例:

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

SQL 等价于:

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

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

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

举例:

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

SQL 等价于:

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

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

举例:

SQL 等价于:

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

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)

大于。

举例:

Entry.objects.filter(id__gt=4)

SQL 等价于:

SELECT ... WHERE id > 4;

大于等于。

小于。

小于等于

区分大小写的开头为。

举例:

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

SQL 等价于:

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

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

不区分大小写的开头为。

举例:

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

SQL 等价于:

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

SQLite 用户

区分大小写的结尾为。

举例:

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

SQL 等价于:

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

SQLite 用户

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

不区分大小写的结尾为。

举例:

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

SQL 等价于:

SELECT ... WHERE headline ILIKE '%Lennon'

Original: https://blog.csdn.net/qq_53810226/article/details/123564173
Author: 是先生了
Title: django学习小笔记

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/735390/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球