obj_user = User(name=data["name"], email=data["email"], phonenumber=data["phonenumber"],
remark=data["remark"])
obj_user.password = 123456
obj_user.avatar = "/media/userAvatar/001.png"
obj_user.create_time = datetime.now().date()
# 优先使用 timezone.now() 而非 datetime.now(),确保时区一致性
obj_user.save() # save就是添加数据库
print(f"保存数据库id是{obj_user.id}")# 2. 构造User模型实例列表(不先调用save(),仅封装数据) user_obj_list = [] for data in data_list: # 构造单个User对象(和你单条逻辑一致,补充公共字段) obj_user = User( name=data["name"], email=data["email"], phonenumber=data["phonenumber"], remark=data["remark"] ) # 补充公共字段(批量数据的公共属性可统一赋值) obj_user.password = 123456 obj_user.avatar = "/media/userAvatar/001.png" # 优先使用 timezone.now(),确保时区一致性 obj_user.create_time = timezone.now().date() # 或 datetime.now().date()(非Django场景) # 将对象加入列表,暂不保存 user_obj_list.append(obj_user) # 3. 批量保存到数据库(核心:bulk_create()) if user_obj_list: # 先判断列表非空,避免无效操作 # bulk_create 接收模型实例列表,一次性插入所有数据 User.objects.bulk_create(user_obj_list)
obj_user = User(id=data["id"], email=data["email"], phonenumber=data["phonenumber"], remark=data["remark"], status=data["status"], avatar=data["avatar"]) # 优先使用 timezone.now() 而非 datetime.now(),确保时区一致性 obj_user.update_time = datetime.now().date() obj_user.save(update_fields=['email', 'phonenumber', 'avatar', 'update_time', 'remark', 'status']) # 这里还是建议全部更新。 obj_user.save() 敏感数据可以不更新。
book = BookInfo()
book.id = request.POST.get("id")
book.bookName = request.POST.get("name")
book.price = request.POST.get("price")
book.publishDate = request.POST.get("publishDate")
book.bookType_id = request.POST.get("bookType_id")
book.save()删除所有数据 BookInfo.objects.all().delete() #删除指定id数据 BookInfo.objects.get(id=1).dellete() #根据条件删除多条数据 BookInfo.objects.filter(price_gte=90).delete() #从user role 表删除 userid=? 的记录 UserRole.objects.filter(user_id=user_id).delete()
#查询全部
booList = BookInfo.objects.all()
# 只返回 id 和 name 字段(推荐)
type_list = list(ArticleType.objects.all().values('id', 'name'))
根据id查询
book = BookInfo.objects.get(id=3)#返回 单个数据 id=3
根据name 和 pwd查询
user = User.objects.get(name=name, password=password)
get()方法的工作原理
get()方法在设计上用于获取唯一一条记录的场景
它的核心行为准则是:
•找到1条记录:成功返回该模型对象。
•找到0条记录:抛出该模型类的 DoesNotExist异常
•找到2条或更多记录:抛出该模型类的 MultipleObjectsReturned异常
#排序
menuQuerySet = Menu.objects.order_by("order_num")
#获取取数量
if Menu.objects.filter(parent_id=id).count() > 0:
filter查询
booList =BookInfo.objects.filter(id=2,price=100.01)
booList =BookInfo.objects.filter(id=2)
d = dict(id=2, price=100.01)
booList = BookInfo.objects.filter(**d)
filter 加 or 查询
booList = BookInfo.objects.filter(Q(id=1)|Q(price=100.01)) #这是or 查询 id=1 或者 price = 100.01
print(booList)
filter 加 不等于查询
booList = BookInfo.objects.filter(~Q(id=1)|Q(price=100.01)) #这是or 查询 id!=1 或者 price = 100.01
print(booList)
Exclued 返回不满足的条件。
booList = BookInfo.objects.exclude(id=1) #id != 1
print(booList)
#分页查询 还有搜索条件
# 这是数据集 不是序列化对象
userListPage = Paginator(User.objects.filter(name__icontains=query), pageSize).page(pageNum)
total = User.objects.filter(name__icontains=query).count()
obj_users = userListPage.object_list.values() # 转成字典 dict
users = list(obj_users) # 这个就是我们要的数据了。序列化的数据了。 把外层的容器换成list以下是整理后的 Django 高级查询匹配符 表格,结构更清晰易读:
| 匹配符 | 使用示例 | 说明 |
|---|---|---|
__exact | filter(job__exact="开发") | 精确等于,如 SQL 的like '开发' |
__iexact | filter(job__iexact="开发") | 精确等于并忽略大小写 |
__contains | filter(job__contains="开发") | 模糊匹配,如 SQL 的like '%开发%' |
__icontains | filter(job__icontains="开发") | 模糊匹配,忽略大小写 |
__gt | filter(job__gt=5) | 大于 |
__gte | filter(job__gte=5) | 大于等于 |
__lt | filter(job__lt=5) | 小于 |
__lte | filter(job__lte=5) | 小于等于 |
__in | filter(job__in=[1,2,3]) | 判断是否在列表内 |
__startswith | filter(job__startswith="开发") | 以…… 开头 |
__istartswith | filter(job__istartswith="开发") | 以…… 开头并忽略大小写 |
__endswith | filter(job__endswith="开发") | 以…… 结尾 |
__iendswith | filter(job__iendswith="开发") | 以…… 结尾并忽略大小写 |
__range | filter(job__range="开发") | 在…… 范围内(注:通常用于数值 / 日期范围,如__range=(1,5)) |
__year | filter(job__year=2018) | 日期字段的年份 |
__month | filter(job__month=12) | 日期字段的月份 |
__day | filter(job__day=30) | 日期字段的天数 |
__isnull | filter(job__isnull=True/False) | 判断是否为空 |

class Article(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField('标题', max_length=300)
# 分类 被删除后,其发布的文章没有保留意义, 也删除
type = models.ForeignKey(ArticleType, on_delete=models.CASCADE, verbose_name='博客类别')
# 核心修改:CharField → TextField(支持长文本,无长度限制)
content = models.TextField('内容')
# 用户被删除后,其发布的文章没有保留意义, 也删除
author = models.ForeignKey('user.MyUser', on_delete=models.CASCADE, verbose_name='用户')
top_article_list = Article.objects.filter(top=1, state=1).order_by('-create_time')[:5]
执行这行代码时,Django 只会:
1 查 Article 表的所有字段(包括 type_id,这是 Article 表自己的字段,不是 ArticleType 表的)
2 不会连接 ArticleType 表,也不会执行任何关于 ArticleType 的 SQL;
3 type_id 只是一个普通的数字(比如 1、2),和 top、state 字段没有本质区别,不会触发额外查询。
只有这 2 种情况,才会查 ArticleType 表
# 代码中访问 → 触发查询for article in top_article_list:
print(article.type.name) # 这里才会查 ArticleType 表
<!-- 模板中访问 → 触发查询 -->
{{ article.type.name }}
假如是返回json 数据。那么type 是什么。
def article_list_api(request):
# 查询文章(和之前一样,只查 Article 表)
article_list = Article.objects.filter(state=1).order_by('-create_time')[:10]
# 手动构造返回的字典(决定 JSON 包含哪些字段)
result = []
for article in article_list:
article_dict = {
"id": article.id,
"title": article.title,
"content": article.content,
"top": article.top,
"state": article.state,
# 情况1-1:只返回 type 的 ID(默认,不触发额外查询)
"type_id": article.type_id, # 直接取 Article 表的 type_id 字段,不查 ArticleType
# 情况1-2:返回 type 的完整信息(会触发额外查询)
# "type": {
# "id": article.type.id,
# "name": article.type.name, # 这里会查 ArticleType 表
# "desc": article.type.desc
# },
"create_time": article.create_time.strftime('%Y-%m-%d %H:%M:%S'),
"update_time": article.update_time.strftime('%Y-%m-%d %H:%M:%S')
}
result.append(article_dict)
# 返回 JSON 响应
return JsonResponse({"code": 200, "data": result})站长微信:xiaomao0055
站长QQ:14496453