我有一個包含大約 30 列的表,我想以高度重復的方式將五個過濾器附加到大多數列。所以我希望我可以使用類裝飾器來按照這個 SO answer定義它們。沒有喜悅。TypeError: 'NoneType' object is not callable(在我呼叫視圖的運行時)
無論如何,然后我閱讀了有關“正確”元分類的資訊并嘗試了
class SettingsMeta(type):
def __new__(cls, clsname, bases, attrs):
for name in ('fx_t', 'status'): # just two for now but target ~60 with 5 different lookup_expr
attr_name = name '_start'
attrs[attr_name] = FD.CharFilter(
field_name = name,
lookup_expr = 'istartswith' ,
label = name.replace('_t','').capitalize() ' starts with',
)
return super(SettingsMeta, cls).__new__(cls, clsname, bases, uppercase_attrs)
class SelectMaskdataFilters( FD.FilterSet, metaclass=SettingsMeta):
class Meta:
model = Maskdata
fields = {
'notes': [ 'icontains',],
}
#status_sw = FD.CharFilter( field_name='status', lookup_expr='startswith')
...
再次沒有喜悅:TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases在服務器啟動時。
如果我只是洗掉,SelectMaskDataFilters 本身就會在視圖中按預期作業 metaclass=SettingsMeta
我在我的頭上,但我真的不喜歡用大約一百個過濾器定義重復自己,所有這些定義幾乎都是一樣的。那么,除了復制、粘貼和容易出錯的小改動之外,有人知道如何在 FilterSet 中定義大量過濾器嗎?注意,大多數過濾器都不會使用method=,lookup_expr=所以fields內部Meta類中的屬性沒有用
uj5u.com熱心網友回復:
您可以在 的本地范圍內定義這些SelectMaskdataFilters:
import django_filters
class SelectMaskdataFilters(django_filters.FilterSet):
for name in ('fx_t', 'status'):
label = name.replace('_t','').capitalize()
locals()[f'{name}_start'] = django_filters.CharFilter(
field_name=name,
lookup_expr='istartswith' ,
label=f'{label} starts with'
)
class Meta:
model = Maskdata
fields = {
'notes': [ 'icontains',],
}
uj5u.com熱心網友回復:
元類沖突錯誤是由于您從 ( FD.FilterSet) 繼承的類已經使用自定義元類。所以,如果你繼承你的 from type,Python 有沖突的元類,它不能很好地協同作業:metaclass.__new__應該呼叫哪個方法?您的元類或 FD.FilterSet 元類中的那個。
使其正常作業的方法是讓您的元類協同作業,并擁有一個解決沖突的元類。在這種情況下,您所要做的就是繼承FD.FieldSet自身的元類而不是type. (當然,還需要呼叫超類的方法)
您可以使用型別的單引數形式來獲取正確的元類,甚至不需要顯式匯入它。
在您的串列中,只需更改此行:
class SettingsMeta(type):
為了
class SettingsMeta(type(FD.FilterSet)):
并且一切都應該正常作業(無需在每個模型的班級主體中重復自己)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/417357.html
標籤:
