在 Django ORM 中,values
和 values_list
方法用于查询特定字段的数据,并返回字典或元组形式的结果,在需要优化查询性能或只需要特定字段的数据时非常有用。
values
方法
values
方法返回一个包含字典的 QuerySet
,每个字典对应一个对象,字典的键是字段名,值是字段的值。
用法
python
queryset = Model.objects.values('field1', 'field2', ...)
示例
假设我们有一个包含商品信息的模型 Product
:
python
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
stock = models.IntegerField()
def __str__(self):
return self.name
获取所有商品的名称和价格:
python
products = Product.objects.values('name', 'price')
for product in products:
print(product['name'], product['price'])
values_list
方法
values_list
方法返回一个包含元组的 QuerySet
,每个元组对应一个对象,元组的元素是字段的值。可以使用 flat=True
参数将结果展平为单个值的列表。
用法
python
queryset = Model.objects.values_list('field1', 'field2', ...)
示例
获取所有商品的名称和价格:
python
products = Product.objects.values_list('name', 'price')
for product in products:
print(product[0], product[1])
获取所有商品的名称(使用 flat=True
):
python
product_names = Product.objects.values_list('name', flat=True)
for name in product_names:
print(name)
将结果赋值给 Python 列表
你可以将 values
或 values_list
的结果转换为 Python 列表,以便进一步处理。
示例
将所有商品的名称和价格赋值给 Python 列表:
python
product_list = list(Product.objects.values('name', 'price'))
print(product_list)
将所有商品的名称赋值给 Python 列表(使用 flat=True
):
python
product_names = list(Product.objects.values_list('name', flat=True))
print(product_names)
使用数据
你可以使用这些数据进行各种操作,例如计算、过滤、排序等。
示例
计算所有商品的总库存:
python
total_stock = sum(Product.objects.values_list('stock', flat=True))
print(f"Total stock: {total_stock}")
获取价格大于100的商品名称:
python
expensive_products = Product.objects.filter(price__gt=100).values_list('name', flat=True)
for name in expensive_products:
print(name)
综合示例
使用 values
和 values_list
方法,并将结果赋值给 Python 列表进行进一步处理:
python
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
stock = models.IntegerField()
def __str__(self):
return self.name
# 获取所有商品的名称和价格,并将结果赋值给 Python 列表
product_list = list(Product.objects.values('name', 'price'))
print("Product List:", product_list)
# 获取所有商品的名称,并将结果赋值给 Python 列表
product_names = list(Product.objects.values_list('name', flat=True))
print("Product Names:", product_names)
# 计算所有商品的总库存
total_stock = sum(Product.objects.values_list('stock', flat=True))
print(f"Total stock: {total_stock}")
# 获取价格大于100的商品名称
expensive_products = Product.objects.filter(price__gt=100).values_list('name', flat=True)
print("Expensive Products:")
for name in expensive_products:
print(name)