__(双下划线)是什么?
在Django中,__(双下划线)用于通过模型之间的关系字段编写数据库查询。简单来说,它用于访问与其他表连接的字段或过滤具有特定条件的数据。
例如,当两个或多个模型通过ForeignKey
或OneToOneField
等关系连接时,可以通过这些关系访问所需的字段。在这里,__
充当一种“连接环”的角色,将不同模型的字段像链条一样连接起来进行访问。
示例:在模型关系中使用__
下面是一个简单的示例。假设Profile
模型与User
模型连接,并且该用户模型中有一个username
字段。我们可以在Profile
模型中根据User
的username
来过滤特定的配置文件。
模型定义:
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
是关键。user
是Profile
模型与CustomUser
连接的字段,要访问该字段的username
,只需通过__
连接即可。这样就可以在Profile
模型中根据CustomUser
的username
字段提取数据。
__的多种应用
__
不仅用于字段访问,还经常用于添加条件。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)
现在假设我们想根据CustomUser
的username
从Order
中查询数据。
多重关系过滤:
# 查询username为'jesse'的用户的订单
orders_for_user = Order.objects.filter(profile__user__username='jesse')
在这里,我们通过profile__user__username
访问CustomUser
的字段,沿着多个关系层次,Order
→ Profile
→ CustomUser
的关系通过__
连接,实现简单的过滤。
总结
__
用于参考模型间关系的字段。- 可以设置多种查询条件以过滤数据。
- 可以通过连接多重关系字段来简单处理复杂的查询。
现在您已经理解了__
的角色和用法,您将能够在Django ORM中编写更强大的查询。脑中把握数据库的关系结构,合理利用这个符号,将能高效处理数据,简单应对复杂关系。
댓글이 없습니다.