일부 모델에 대해 다음과 같은 필터 세트가 있습니다.
class MyModel(models.Model):
STATUS_ACTIVE = 0
STATUS_DONE = 1
STATUSES = (
(STATUS_ACTIVE, 'Active'),
(STATUS_DONE, 'Done'),
)
status = models.IntegerField(choices=STATUSES, default=STATUS_ACTIVE)
class ModelFilter(FilterSet):
status = ChoiceFilter(choices=MyModel.STATUSES)
class Meta:
model = MyModel
fields = (
'status',
)
API를 요청할 때 status를 number-으로 사용해야합니다 /app/model?status=0
.
/app/model?status=active
모델을 변경하지 않고 번호 대신 사용할 수 있도록 별칭을 만드는 방법은 무엇입니까?
마지막으로 라이브러리 내부에서 소스 코드를 발견하고이 솔루션을 만들었습니다.
class AliasesChoiceField(ChoiceField):
def valid_value(self, value):
for _, v in self.choices:
if value == v or str(value) == str(v):
return True
return False
class AliasesChoiceFilter(ChoiceFilter):
field_class = AliasesChoiceField
def filter(self, qs, value):
for val, alias in self.extra['choices']:
if value == alias:
return super(AliasesChoiceFilter, self).filter(qs, val)
return super(AliasesChoiceFilter, self).filter(qs, value)
에 AliasesChoiceField.valid_value()
난 그냥 제대로 검증 값에 간단한 변경으로 기본 방법을 복사.
AliasesChoiceFilter
사용 field_class
전 단지로 교체, 그래서 확인을 위해 ChoiceFilter
및 변경 filter()
방법 나의 선택 매개 변수의 올바른 매핑에.
마지막으로 내 모델은 다음과 같습니다.
class ModelFilter(FilterSet):
STATUSES = (
(MyModel.STATUS_ACTIVE, 'active'),
(MyModel.STATUS_DONE, 'done')
)
status = AliasesChoiceFilter(choices=STATUSES)
그리고 API 경로 /app/model?status=active
가 올바르게 작동하여 필터링에 올바른 상태를 설정합니다.
그러나! 이 솔루션은 Django Admin 또는 웹 API 인터페이스를 통해 작동하지 않습니다. 실제 값을 제공하고 0
대신 전달하려고하기 때문 입니다.active
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다