详解Django的 only() 函数:只选择指定的字段

  • Post category:Python

当你在Django的数据库查询中使用values()函数或values_list()函数的时候,你往往获取了许多你并不需要的数据。这些数据会增加查询的时间和内存开销,而这时候,only()函数就可以起到很好的作用。

only()函数可以帮助你只选择你所需要的字段,而忽略其他字段。通过这种方式,你可以在减少数据传输的同时也减少不必要的内存空间的开销。

以下是该函数的使用方法及注意事项:

语法

只需要在你的查询语句(QuerySet)中添加only()函数即可。

Model.objects.only('field1', 'field2')

也可以使用通配符*,选择所有字段。

Model.objects.only(*fields)

实例

我们使用一个名为’Person’的Django模型进行以下实例。

class Person(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField(db_index=True)
    email = models.EmailField(max_length=254)
    phone = models.CharField(max_length=20)

    def __str__(self):
        return self.name

实例1

假设我们需要查询’Person’模型中所有名字为’Lucy’的年轻人,并且只需要返回名字和年龄两个字段,我们可以这样使用only()函数。

youngsters = Person.objects.filter(name='Lucy', age__lt=30).only('name', 'age')

以上代码中,我们通过filter()函数筛选出名字为’Lucy’且年龄小于30的人,然后使用only()函数将查询结果限定为只有名字和年龄两个字段。

实例2

现在假设我们需要查询所有’name’字段为’Lucy’的人员数据,并将这些人员的电子邮箱地址和电话号码字段加入查询结果中。这次我们并不想返回年龄字段,我们可以如下查询。

lucys_info = Person.objects.filter(name='Lucy').only('email', 'phone')

以上代码中,我们通过filter()函数筛选出’name’字段为’Lucy’的人员数据,然后使用only()函数将查询结果限定为只有电子邮箱地址和电话号码两个字段。

当我们仅仅需要返回一个模型的几个字段时,only()函数是一个非常有用的方法。除了可以提高查询效率、降低网络数据传输负担,还可以提高代码的可读性。