[英]Django-filter 2 use @property to filter?
我有這個過濾器:
class SchoolFilter(django_filters.FilterSet):
class Meta:
model = School
fields = {
'name': ['icontains'],
'special_id': ['icontains'],
}
其中special_id
是學校 Model 的@property:
@property
def special_id(self):
type = self.type
unique_id = self.unique_id
code = self.code
if unique_id < 10:
unique_id = f'0{unique_id}'
if int(self.code) < 10:
code = f'0{self.code}'
special_id = f'{code}{type}{id}'
return special_id
我試圖用谷歌搜索一些答案,但找不到任何東西。 現在如果我像我一樣使用我的過濾器,我只會收到這個錯誤:
'Meta.fields' contains fields that are not defined on this FilterSet: special_id
如何將屬性定義為此 FilterSet 的字段? 我甚至可以將 django-filter 與@property 一起使用嗎?
感謝您的任何回答!
更新:
弄清楚了。 不是最漂亮的解決方案,但ayyy
class SchoolFilter(django_filters.FilterSet):
special_id = django_filters.CharFilter(field_name="special_id", method="special_id_filter", label="Special School ID")
def special_id_filter(self, queryset, name, value):
schools_pk = []
for obj in queryset:
if obj.special_id == value:
schools_pk.append(obj.pk)
queryset = queryset.filter(pk__in=schools_pk)
return queryset
class Meta:
model = School
fields = {
'name': ['icontains'],
'special_id': ['icontains'],
}
你不能。 FilterSet 將僅過濾實際字段,因為 FilterSet 會更改 QuerySet。
QuerySets 根據應用的過濾器執行數據庫調用,這意味着您只能過濾實際存儲在數據庫中的字段。
您可以注釋您的 QuerySet 以添加 special_id,但是像這樣的注釋鏈接在一起非常復雜。
更好的方法是在您的 FilterSet 上創建一個自定義過濾器,但我不確定如何執行此操作。 如果您可以解釋什么是 special_id,以及為什么要通過 icontains 搜索它,那么我可能會為您指明正確的方向。
FilterSet
通過過濾查詢集(將 where 條件添加到底層 sql)來操作。 這意味着, FilterSet
只能對數據庫中存在的Columns
進行操作。 這里的special_id
是一個計算屬性(它不是列,它是使用其他字段/列動態計算的),所以它不會工作。
解決方法是使special_id
成為普通字段/列,在運行時計算值並在保存時寫入數據庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.