__(双下划线)是什么?
在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
形成1:1的关系。现在我们来看一下如何使用__
来访问Profile
中的CustomUser
字段。
使用__的查询:
# 基于CustomUser的username过滤Profile对象
profiles = Profile.objects.filter(user__username='jesse')
其中user__username
是关键。user
是Profile
模型与CustomUser
关联的字段,要访问该字段的username
,需要通过__
连接。这样就可以基于CustomUser
的username
字段从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)
现在假设我们希望基于CustomUser
的username
从Order
中查询数据。
多重关系过滤:
# 查询username为'jesse'的CustomUser的订单
orders_for_user = Order.objects.filter(profile__user__username='jesse')
在这里,通过profile__user__username
可以沿着多层关系访问CustomUser
的字段。这是通过__
将Order
→ Profile
→ CustomUser
的关系连接在一起,简单地实现了过滤。
总结
__
用于在模型之间的关系中引用字段。- 可以设置各种查询条件以过滤数据。
- 通过连接多重关系字段,可以简单地处理复杂的查询。
现在你已经理解了__
的作用和用法,可以在Django ORM中编写更强大的查询了。考虑数据库的关系结构,适当地使用这个符号,你将能够高效地处理数据并简化复杂关系的处理。
Add a New Comment