![](/img/trans.png)
[英]django_filters returns True is not a valid field when filtering through rest api
[英]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_value
其filing_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.