【问题标题】:django_filters search on field in ManyToMany through modeldjango_filters 通过模型搜索 ManyToMany 中的字段
【发布时间】:2021-06-03 06:31:16
【问题描述】:

我与直通模型(联合表)有多对多关系。我想利用 DRF 中的 search_fields 或其他自定义过滤器来过滤 through 模型中的字段。

模型 1:

class Company(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255, blank=False, null=False)
    source = models.CharField(max_length=255, blank=False, null=False)
    ein_number = models.CharField(max_length=255, blank=True, null=False)
    record_keepers = models.ManyToManyField(
        'record_keepers.RecordKeepers', through='record_keepers.CompanyRecordKeepers',
        related_name='record_keepers')

模型 2(通过模型):

class CompanyRecordKeepers(models.Model):
    id = models.AutoField(primary_key=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    filing_year = models.IntegerField(blank=False, null=False)
    company = models.ForeignKey('employers.Company', on_delete=models.PROTECT,
                                blank=True, null=False)
    record_keeper = models.ForeignKey('RecordKeepers', on_delete=models.PROTECT, blank=True, null=False)

模型 3:

class RecordKeepers(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255, unique=True, blank=True, null=True)

现在在我看来,我想搜索在filing_year 2019 中提交且record_keeper 名称包含some_value 的公司

查看:

class ListCompanyView(generics.ListAPIView):
    serializer_class = CompanySerializer
    permission_classes = [IsAdminUser]
    filter_backends = (SearchFilter,)
    search_fields = ['companyrecordkeepers__filing_year']
    queryset = Company.objects.all()

理想情况下,我可以使用一些参数进行 GET 请求以进行过滤:

?companyrecordkeepers__filing_year=2019&name=some_value

知道如何做到这一点吗?

【问题讨论】:

    标签: python django django-rest-framework django-filter


    【解决方案1】:

    如果您不指定related_name,您需要在查询反向关系时添加后缀_set。此外,SearchFilter 用于简单的单个查询参数,因此对于您的情况,最好将它们定义为filterset_fieldshttps://www.django-rest-framework.org/api-guide/filtering/#filtering-against-query-parameters

    class ListCompanyView(generics.ListAPIView):
        serializer_class = CompanySerializer
        permission_classes = [IsAdminUser]
        filter_backends = [DjangoFilterBackend]
        filterset_fields = ['companyrecordkeepers_set__filling_year', 'name']
        queryset = Company.objects.all()
    

    【讨论】:

    • 我收到此错误:'Meta.fields' must not contain non-model field names: companyrecordkeepers_set__filing_year
    猜你喜欢
    • 2016-11-10
    • 2015-12-23
    • 2013-05-23
    • 2012-06-12
    • 2021-06-07
    • 2015-05-15
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    相关资源
    最近更新 更多