簡體   English   中英

Django-filter 2 使用@property 過濾?

[英]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 搜索它,那么我可能會為您指明正確的方向。

這是 MethodFilter 的實現,我認為它與您想要的相似。

FilterSet通過過濾查詢集(將 where 條件添加到底層 sql)來操作。 這意味着, FilterSet只能對數據庫中存在的Columns進行操作。 這里的special_id是一個計算屬性(它不是列,它是使用其他字段/列動態計算的),所以它不會工作。

解決方法是使special_id成為普通字段/列,在運行時計算值並在保存時寫入數據庫。

暫無
暫無

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

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