最近搜索

python django 操作数据库

浏览:29
管理员 2026-01-05 00:01




添加数据

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 高级查询匹配符 表格,结构更清晰易读:

匹配符使用示例说明
__exactfilter(job__exact="开发")精确等于,如 SQL 的like '开发'
__iexactfilter(job__iexact="开发")精确等于并忽略大小写
__containsfilter(job__contains="开发")模糊匹配,如 SQL 的like '%开发%'
__icontainsfilter(job__icontains="开发")模糊匹配,忽略大小写
__gtfilter(job__gt=5)大于
__gtefilter(job__gte=5)大于等于
__ltfilter(job__lt=5)小于
__ltefilter(job__lte=5)小于等于
__infilter(job__in=[1,2,3])判断是否在列表内
__startswithfilter(job__startswith="开发")以…… 开头
__istartswithfilter(job__istartswith="开发")以…… 开头并忽略大小写
__endswithfilter(job__endswith="开发")以…… 结尾
__iendswithfilter(job__iendswith="开发")以…… 结尾并忽略大小写
__rangefilter(job__range="开发")在…… 范围内(注:通常用于数值 / 日期范围,如__range=(1,5)
__yearfilter(job__year=2018)日期字段的年份
__monthfilter(job__month=12)日期字段的月份
__dayfilter(job__day=30)日期字段的天数
__isnullfilter(job__isnull=True/False)判断是否为空


image.png




查询一对一  一般情况是不查的 对面的表的

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