django数据库 增删改查 之 查

[复制链接]
查看: 1687   回复: 0

306

主题

306

帖子

1703

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1703
2024-2-18 10:19:27   显示全部楼层   阅读模式  
通用封面.jpg

基础操作

1.png

进阶滤波器操作


2.png

一、小得示例代码
def get_person(request):
    # 查询不会,破坏元数据所以不需要使用try来判断是否成功
    # get他会得到数据库中得一条数据
    # p = person.objects.get(id=24)  # person 对象
    # p = person.objects.get(pk=24)  # pk是主键得意思
    # p = person.objects.get(age=23388)  # 多对象被返回get() returned more than one person -- it returned 6!
    # # get方法就是不能找不到 也不能找多个 person matching query does not exist.
    # print(p, p.name)

    # persons = person.objects.all()
    # # print(persons, type(persons))
    # # queryset 返回得就是一个查询集类型class 'django.db.models.query.QuerySet'
    # # 可以遍历查询集
    # for p in persons:
    #     print(p.name,p.age)
    # pass

    p = person.objects.first()  # 查询集得第一条数据
    p = person.objects.last()  # 查询集得最后一条数据
    print(p.name)
    return HttpResponse('查询成功')
模型返回得类型可以再Model.py里面定义
class person(models.Model):
    name = models.CharField(max_length=20, unique=True)
    age = models.PositiveIntegerField(default=18)

    class Meta:
        # 定义表名
        db_table = 'tb_person'
    def __str__(self):
        return f'{self.name} - {self.age}'
二、filter滤波也是可以套娃
  p = person.objects.filter(age__gt=26).filter(id__lt=23)
    print(p)
    # for i in p:
    #     print(i.name,i.age,i.id)
三、也可以可以__in 元组形势 多选查询
    p = person.objects.filter(age__in=[10,11])
    print(p.values('name'))# 查询结果可以vales 过滤

其次还有排序 聚合等等这些功能 只是表达问题 可以借助ai可以跳着学

在Django的ORM(Object-Relational Mapping)中,有几种主要的方法来查询数据库。以下是一些常用的查询方法:
  • filter():
    filter() 是最常用的一种方法,它返回一个QuerySet,表示从数据库中检索的对象集合。你可以使用它来进行复杂的查询,包括使用逻辑运算符(and、or)和关系字段。
    python复制代码

    # 获取id大于23的所有Person对象  

    persons = Person.objects.filter(id__gt=23)  

      

    # 获取名字是'John'的所有Person对象  

    persons_named_john = Person.objects.filter(name='John')  

      

    # 使用多个条件查询  

    persons_over_30 = Person.objects.filter(age__gt=30, is_active=True)
  • get():
    get() 方法也返回一个对象,但是当你确定查询结果应该只包含一个对象时使用。如果查询结果有多个对象或没有对象,get() 会引发异常。
    python复制代码

    # 获取id为42的Person对象  

    person = Person.objects.get(id=42)
  • exclude():
    exclude() 方法与 filter() 相反,它返回不满足给定条件的对象集合。
    python复制代码

    # 获取id不大于23的所有Person对象  

    persons = Person.objects.exclude(id__lte=23)
  • values() 和 values_list():
    values() 方法返回一个QuerySet,它包含字典,每个字典表示一个对象,键是字段的名称,值是字段的值。values_list() 方法类似,但返回的是元组列表。
    python复制代码

    # 获取所有Person对象的id和name字段  

    persons_data = Person.objects.values('id', 'name')  

      

    # 获取所有Person对象的id和name字段,作为元组列表  

    persons_data_list = Person.objects.values_list('id', 'name')
  • annotate() 和 aggregate():
    annotate() 用于给QuerySet中的每个对象添加额外的计算字段,通常是用于执行聚合函数。aggregate() 则对整个QuerySet执行一个聚合函数,并返回一个包含单个值的字典。
    python复制代码

    # 计算每个Person对象的总分数(假设有一个score字段)  

    persons_with_total_score = Person.objects.annotate(total_score=Sum('score'))  

      

    # 计算所有Person对象的总分数  

    total_score = Person.objects.aggregate(Sum('score'))
  • order_by():
    order_by() 方法用于对QuerySet中的对象进行排序。
    python复制代码

    # 按年龄升序排序所有Person对象  

    persons_ordered = Person.objects.order_by('age')  

      

    # 按年龄降序排序所有Person对象  

    persons_ordered_desc = Person.objects.order_by('-age')
  • count():
    count() 方法返回QuerySet中的对象数量。
    python复制代码

    # 计算Person对象的总数  

    total_persons = Person.objects.count()
  • exists():
    exists() 方法检查QuerySet中是否至少有一个对象。
    python复制代码

    # 检查是否存在id为42的Person对象  

    has_person = Person.objects.filter(id=42).exists()

除了上述方法,Django还提供了其他更高级的查询方法,如 select_related() 和 prefetch_related(),用于优化关联对象的查询性能。这些方法通常用于处理具有外键关系的模型。
使用这些查询方法时,请确保你已经正确设置了Django的模型(models.py)和数据库配置(settings.py)。

数据库经典格式
from django.db import models

# Create your models here.
class MapPoint(models.Model):
    TYPE_CHOICES = (
        (1, '主站点'),
        (0, '副站点'),
        # 添加其他类型选项,如果需要的话
    )

    type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, default=1)
    x = models.FloatField()  # 根据数据,x应该是一个浮点数
    y = models.FloatField()  # y同样是一个浮点数
    z = models.FloatField()  # z也是一个浮点数11
    name = models.CharField(max_length=255)  # 假设name的长度不会超过255个字符

    class Meta:
        db_table = 'Map_Point'





回复

使用道具 举报

您需要登录后才可以回帖   登录 立即注册

高级模式

南通谢凡软件科技有限公司