没有其他直接字段的其他模型上的Django api过滤器搜索

问题描述 投票:0回答:1

我有两个模型,分别是用户,技能和个人资料。我正在尝试对用户的技能实施搜索过滤器。这意味着当某人搜索用户技能中包含的内容时,该用户将出现在搜索结果中。

注意:当用户注册时,将使用信号为该用户自动创建配置文件。用户只需更新其个人资料即可添加技能和其他功能。

用户模型

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=254, unique=True)
    name = models.CharField(max_length=250)
    picture = models.TextField(null=True, blank=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    last_login = models.DateTimeField(null=True, blank=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    slug = models.SlugField(max_length=255, unique=True, blank=True)

个人资料模型

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='profiles')
    date_of_birth = models.DateField(blank=True, verbose_name="DOB", null=True)
    bio = models.TextField(max_length=500, blank=True, null=True)
    skills = models.ManyToManyField(Skill, related_name='skills')
    sex = models.CharField(max_length=6, choices=SEX, blank=True, null=True)
    type_of_body = models.CharField(max_length=8, choices=BODYTYPE, blank=True, null=True)
    feet = models.PositiveIntegerField(blank=True, null=True)
    inches = models.PositiveIntegerField(blank=True, null=True)
    lives_in = models.CharField(max_length=50, blank=True, null=True)
    updated_on = models.DateTimeField(auto_now=True)

技能模型

class Skill(models.Model):
    name = models.CharField(max_length=60)
    subcategory = models.CharField(max_length=60, blank=True, null=True)
    description = models.TextField(null=True, blank=True)
    created_on = models.DateTimeField(auto_now=True)
    updated_on = models.DateTimeField(auto_now_add=True)
    updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.DO_NOTHING)

用户视图,从中进行搜索

class ListUsersView(generics.ListAPIView):
    '''
    Gets all the users in the database
    '''
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = [AllowAny]
    filter_backends = [filtr.SearchFilter]
    search_fields = ['email', 'name']

当前,上面的解决方案有效,但是当我将search_fields等其他字段添加到profiles__skills时,如果要包含具有由用户创建的类似技能的结果,则该代码将不起作用。

请,如何获得用户个人资料中显示在搜索结果中的技能?

django django-rest-framework django-filter
1个回答
0
投票

SearchFilter类支持简单的基于单个查询参数的搜索。 search_fields属性应该是模型上文本类型字段名称的列表。

个人档案__技能不是一个字段。您应该使用文本字段,例如。个人档案__技能__名称

class ListUsersView(generics.ListAPIView):
    '''
    Gets all the users in the database
    '''
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = [AllowAny]
    filter_backends = [filtr.SearchFilter]
    search_fields = ['email', 'name', 'profiles__skills__name']
© www.soinside.com 2019 - 2024. All rights reserved.