我有两个模型UserDetails
和User
。
我有一个简单的搜索,可以检查字符串是否在字段之一中。 我的问题是我不知道如何访问下面的查询集中的一对一字段来进行搜索。
class UserDetails(models.Model):
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
related_name='detail')
details = models.CharField(max_length=100)
class User(models.Model):
name = models.CharField(max_length=100)
desc = models.CharField(max_length=200)
...
search = 'John Doe'
User.objects.filter(
Q(name__icontains=search) |
Q(desc__icontains=search) |
Q(__detail_details=search) . # how to do this?
)
答案 0 :(得分:2)
您使用双下划线(__
),左边的related_name
。所以:
User.objects.filter(
Q(name__icontains=search) |
Q(desc__icontains=search) |
Q(detail__details=search)
)
或者如果您想添加__icontains
查找,
User.objects.filter(
Q(name__icontains=search) |
Q(desc__icontains=search) |
Q(detail__details__icontains=search)
)
鉴于search
为'John Doe'
,我们将返回User
对象,其中name
包含'John Doe'
,desc
包含{{1} }或相关'John Doe'
对象,其UserDetail
列包含details
。
双下划线可以看作是一种“通过”关系的方式,因此可以访问这些相关对象的列。您可以'John Doe'
的方式将它们链接在一起。