簡體   English   中英

django_filters 通過 model 在 ManyToMany 中的字段上搜索

[英]django_filters search on field in ManyToMany through model

我與 model(聯合表)之間存在多對多關系。 我想利用 DRF 中的search_fields或其他自定義過濾器來過濾model 中的字段。

model 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')

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

model 3:

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

現在在我看來,我想搜索在 2019 年申請的公司, some_valuefiling_year名稱包含record_keeper

看法:

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

知道如何做到這一點嗎?

如果您沒有指定related_name,您需要在查詢反向關系時添加后綴_set 此外, SearchFilter用於簡單的單個查詢參數,因此對於您的情況,最好將它們定義為filterset_fields https://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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM