__(双下划线)是什么?

在Django中,__(双下划线)用于通过模型间的关系字段编写数据库查询。简而言之,它用于访问连接到其他表的字段,或过滤具有特定条件的数据。

例如,当两个或多个模型通过ForeignKeyOneToOneField等关系相连接时,可以通过该关系访问所需的字段。在这里,__起到一种“连接环”的作用,通过像链条一样连接不同模型的字段。

示例: 在模型关系中使用__

我们来看一个简单的例子。假设Profile模型与User模型相连,并且用户模型中有一个username字段。我们可以通过Profile模型基于Userusername来过滤特定的个人资料。

模型定义:

from django.db import models
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    pass

class Profile(models.Model):
    user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
    bio = models.TextField()

在上述例子中,Profile模型与CustomUser形成1:1的关系。现在我们来看一下如何使用__来访问Profile中的CustomUser字段。

使用__的查询:

# 基于CustomUser的username过滤Profile对象
profiles = Profile.objects.filter(user__username='jesse')

其中user__username是关键。userProfile模型与CustomUser关联的字段,要访问该字段的username,需要通过__连接。这样就可以基于CustomUserusername字段从Profile模型中获取数据。

__的多种应用

__不仅用于字段访问,还经常用于添加条件。Django在查询集中提供各种条件设置的过滤功能,而其中大多数是通过__实现的。常用的条件包括:

  • exact: 查找完全匹配的值。(为默认值,因此可以省略)
  • icontains: 查找不区分大小写的包含值。
  • gt, lt, gte, lte: 查找大于或小于的值(greater than, less than)。
  • startswith, endswith: 查找以特定字符串开头或结尾的值。

示例: 多种过滤条件

# 查询所有CustomUser的电子邮件包含'gmail.com'的个人资料
profiles_with_gmail = Profile.objects.filter(user__email__icontains='gmail.com')

# 查询CustomUser的ID大于10的个人资料
profiles_with_id_gt_10 = Profile.objects.filter(user__id__gt=10)

# 查询username以'jesse'开头的CustomUser的个人资料
profiles_starting_with_jesse = Profile.objects.filter(user__username__startswith='jesse')

通过__访问多重关系字段

Django最强大的功能之一是即使多个模型连接,也可以通过__沿着多重关系查询数据。例如,考虑这样一种情况:Order模型与Profile相连,Profile又与CustomUser相连。

多重关系模型示例:

class Order(models.Model):
    profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
    order_date = models.DateTimeField()
    amount = models.DecimalField(max_digits=10, decimal_places=2)

现在假设我们希望基于CustomUserusernameOrder中查询数据。

多重关系过滤:

# 查询username为'jesse'的CustomUser的订单
orders_for_user = Order.objects.filter(profile__user__username='jesse')

在这里,通过profile__user__username可以沿着多层关系访问CustomUser的字段。这是通过__OrderProfileCustomUser的关系连接在一起,简单地实现了过滤。

总结

  • __用于在模型之间的关系中引用字段。
  • 可以设置各种查询条件以过滤数据。
  • 通过连接多重关系字段,可以简单地处理复杂的查询。

现在你已经理解了__的作用和用法,可以在Django ORM中编写更强大的查询了。考虑数据库的关系结构,适当地使用这个符号,你将能够高效地处理数据并简化复杂关系的处理。