__(双下划线)是什么?

在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形成了一对一的关系。现在我们来看看如何使用__来访问Profile中的CustomUser字段。

使用__的查询:

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

这里的user__username是关键。userProfile模型与CustomUser连接的字段,要访问该字段的username,只需通过__连接即可。这样就可以在Profile模型中根据CustomUserusername字段提取数据。

__的多种应用

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

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

示例:各种过滤条件

# 查询所有包含'gmail.com'的CustomUser邮箱的Profile
profiles_with_gmail = Profile.objects.filter(user__email__icontains='gmail.com')

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

# 查询username以'jesse'开头的CustomUser的Profile
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'的用户的订单
orders_for_user = Order.objects.filter(profile__user__username='jesse')

在这里,我们通过profile__user__username访问CustomUser的字段,沿着多个关系层次,OrderProfileCustomUser的关系通过__连接,实现简单的过滤。

总结

  • __用于参考模型间关系的字段。
  • 可以设置多种查询条件以过滤数据。
  • 可以通过连接多重关系字段来简单处理复杂的查询。

现在您已经理解了__的角色和用法,您将能够在Django ORM中编写更强大的查询。脑中把握数据库的关系结构,合理利用这个符号,将能高效处理数据,简单应对复杂关系。