通过查询集与一对一字段进行搜索

时间:2018-08-31 09:01:50

标签: python django

我有两个模型UserDetailsUser

我有一个简单的搜索,可以检查字符串是否在字段之一中。 我的问题是我不知道如何访问下面的查询集中的一对一字段来进行搜索。

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?
)

1 个答案:

答案 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'的方式将它们链接在一起。