Python Django Rest框架中动态字段名称的查找\u expr

Python Django Rest框架中动态字段名称的查找\u expr,python,django-rest-framework,Python,Django Rest Framework,型号: class EmployeeModel(models.Model): first_name = models.CharField(max_length=20) last_name = models.CharField(max_length=20) class EmployeeSerializer(serializers.ModelSerializer): class Meta: model = EmployeeModel fi

型号:

class EmployeeModel(models.Model):

    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=20)
class EmployeeSerializer(serializers.ModelSerializer):

    class Meta:
        model = EmployeeModel
        fields = '__all__'
class EmployeeViewSet(viewsets.ModelViewSet):
    
    queryset = EmployeeModel.objects.all()
    serializer_class = EmployeeSerializer
    filterset_class = EmployeeFilterSet
序列化程序:

class EmployeeModel(models.Model):

    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=20)
class EmployeeSerializer(serializers.ModelSerializer):

    class Meta:
        model = EmployeeModel
        fields = '__all__'
class EmployeeViewSet(viewsets.ModelViewSet):
    
    queryset = EmployeeModel.objects.all()
    serializer_class = EmployeeSerializer
    filterset_class = EmployeeFilterSet
视图集:

class EmployeeModel(models.Model):

    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=20)
class EmployeeSerializer(serializers.ModelSerializer):

    class Meta:
        model = EmployeeModel
        fields = '__all__'
class EmployeeViewSet(viewsets.ModelViewSet):
    
    queryset = EmployeeModel.objects.all()
    serializer_class = EmployeeSerializer
    filterset_class = EmployeeFilterSet
我的EmployeeFilterSet如下所示:

class EmployeeFilterSet(django_filters.FilterSet):
   
    first_name__equals = django_filters.CharFilter(method='get_first_name_equals', field_name='first_name')
    last_name__equals = django_filters.CharFilter(method='get_last_name_equals', field_name='last_name')

    def get_first_name_equals(self, queryset, field_name, value):
        query = Q()
        for q_query in [Q(first_name__iexact=name) for name in (value.split(',') if value else [])]:
            query |= q_query
        return queryset.filter(query).all()

     def get_last_name_equals(self, queryset, field_name, value):
        query = Q()
        for q_query in [Q(last_name__iexact=name) for name in (value.split(',') if value else [])]:
            query |= q_query
        return queryset.filter(query).all()

正如我们所看到的,get_first_name_equalsget_last_name_equals具有相似的定义。我使用不同方法的唯一原因是查找表达式在for循环表达式中具有不同的字段名first\u name\u iexact和last\u name\u iexact。有没有一种方法可以让我使用像get_equals()这样的单一方法,并根据传递的字段_name在for循环表达式中形成查找表达式?这将有助于避免编写多个具有不同字段名的类似查找表达式的函数。

您可以使用一个通用函数,该函数(已经)接收
字段名
,并基于它创建一个与
\uuuuuiExact
连接的
dict

它的工作原理如下:

class EmployeeFilterSet(django_filters.FilterSet):
   
    first_name__equals = django_filters.CharFilter(method='get_field_equals', field_name='first_name')
    last_name__equals = django_filters.CharFilter(method='get_field_equals', field_name='last_name')

    def get_field_equals(self, queryset, field_name, value):
        query = Q()
        for q_query in [Q(**{f"{field_name}__iexact": name}) for name in (value.split(',') if value else [])]:
            query |= q_query
        return queryset.filter(query).all()

**
扩展dict后,
Q
对象的参数看起来像预期的
Q(first\u name\u iexact=name)
等等。

您是否考虑过使用扩展在
dict中使用
字段名
?@Rfroes87感谢您的回复。我不知道我到底需要做什么。我尝试了这一点,但不起作用:
对于[q{f{field\u name}\uuuu iexact:name}中的q_查询(value.split(','),if value else[]):
。你能帮我做一个函数,告诉我怎么做吗?这将非常有帮助。将[q(**{f“{field\u name}\uuuu iexact:name})中的q_查询更改为
,用于(value.split(','),if value else[]):
,然后重试。@Rfroes87。。很好。。非常感谢:)