24. Часто используемые методы запроса данных в Django и условия запроса объектов

задняя часть
24. Часто используемые методы запроса данных в Django и условия запроса объектов

Запрос данных в Django:

(1) Общие методы запроса:

  1. Получить все записи:
s = User.objects.all()
  1. Получите первую часть данных:
s = User.objects.first()
  1. Получите последнюю часть данных:
s = User.objects.last()

Замечания по поводу второго и третьего методов:    Для объекта QuerySet мы также можем получить соответствующий экземпляр объекта через значение нижнего индекса. Как показано ниже, хотя эти два метода имеют одну и ту же функцию (получение соответствующего объекта экземпляра), рекомендуемыми (и обычно используемыми) методами являются метод first() и метод last().   Причина — если запрошенные данные не существуют, будет сообщено об ошибке с помощью запроса нижнего индекса; однако использование метода first() не сообщит об ошибке и вернет None.

s = User.objects.filter(age=18).first()     #获取QuerySet中的第一条数据
s2 = User.objects.filter(age=18).last()     #获取QuerySet中的最后一条数据
s = User.objects.filter(age=18)[0]
print(s)

Сценарии применения:

a = User.objects.get(id=56)             #使用get方法获取一个实例对象,我们可以保证id不会重复,但是不能保证id为56的数据是否存在
#但是使用.first()方法哪怕它不存在也不会报错!
a = User.objects.filter(id=56).first()
  1. Получить отфильтрованные записи на основе условий, заданных параметрами:

[Примечание: метод filter(**kwargs): получить отфильтрованный QuerySet в соответствии с условиями извлечения, указанными в параметрах]

s = User.objects.filter(name= "xiaoming" )	# 过滤得到name为xiaoming的数据
  1. Исключить данные с именем xiaoming:
s = User.objects.exclude(name='xiaoming')
  1. Получить объект записи:

[Примечание: объект, возвращаемый get, имеет уникальные свойства. Если есть несколько объектов, соответствующих условиям, get сообщит об ошибке! 】

s = User.objects.get(name = "xiaoming" )
  1. Отсортируйте результаты:
#根据age升序排序:
c = User.objects.all().order_by("age")
#根据age逆向排序:
c2 = User.objects.all().order_by("-age")
#双重排序:age升序排序,如果有age相同的则以id升序排序:
c3 = User.objects.all().order_by("age","id")
  1. Преобразуйте модель в возвращенном QuerySet в словарь:
s = User.objects.all().values()
#作用:现在是字典形式了(之前的QuerySet是类似于列表的对象),就可以使用字典的方法进行获取数据了:
print(s[0].get("name"))

Формат объекта QuerySet:

<QuerySet [<User: name:taka, age:18>, <User: name:xiaopo, age:18>, <User: name:xiaohong, age:18>]>

Формат преобразуется с помощью метода values():

<QuerySet [{'id': 1, 'name': 'taka', 'age': 18}, {'id': 2, 'name': 'xiaopo', 'age': 18}, {'id': 3, 'name': 'xiaohong', 'age': 18}]>
  1. Получите общее количество запрошенных данных:
e = User.objects.count()	 # (所有QuerySet对象都可以使用此方法)

(2) Условия часто используемых объектов запроса:

Условие найти объект означает, что некоторые параметры передаются вышеуказанному методу. Это эквивалентно условию после оператора where в операторе SQL, а синтаксис — это правило имени поля __!

  1. точно эквивалентно знаку равенства: (следующие два метода работают одинаково!)
rs = User.objects.filter(name__exact='xiaoming')
rs = User.objects.filter(name='xiaoming')
  1. iexact: аналогично точному, но игнорирует соответствие регистра.

  2. содержит содержит:

rs = User.objects.filter(name__contains='xiao')     #查询name属性值中包含xiao的
  1. icontains похож на contains, но игнорирует регистр.
  2. С чего начинается:
rs = User.objects.filter(name__startswith='xiao')  # 查询name属性值以xiao开头的
  1. startwith аналогичен startwith, но игнорирует регистр.
  2. Что означает endwith end with: .
  3. isendwith похож на endwith, но игнорирует регистр.
  4. Член принадлежит:
rs = User.objects.filter(age__in=[18,19,20])  # 查询age值为18,19,20的数据
  1. gt больше, чем
rs = User.objects.filter(age__gt=20)  # 查询age值大于20的数据
  1. gte больше или равно.
  2. л меньше чем.
  3. lte меньше или равно.
  4. Диапазон дальности, включая оба конца.
rs = User.objects.filter(age__range=(18,20))  # 查询age值在18-20之间的数据(包含18和20)
  1. isnull определяет, является ли он пустым.

❤️Вы можете отсканировать код, чтобы подписаться на мой официальный аккаунт - любые вопросы можно задавать в официальном аккаунте (там будет специальный человек, который будет на них регулярно отвечать), а галантерея будет время от времени обновляться. Добро пожаловать, чтобы обратить внимание! ❤️

请添加图片描述