[英]How do I order the import fields in admin using django import-export?
我正在使用django import-export和ImportExportModelAdmin
從管理界面將數據從文件導入數據庫。
以下是我使用的模型資源:
class ImportedBetResource(resources.ModelResource):
date = fields.Field(column_name='Date',
attribute='date',
widget=DateWidget(format="%d/%m/%Y"))
time = fields.Field(column_name='Time',
attribute='time',
widget=TimeWidget(format="%H:%M"))
sport = fields.Field(column_name='Sport',
attribute='sport',
widget=ForeignKeyWidget(Sport, 'name'))
country = fields.Field(column_name='Country',
attribute='country',
widget=ForeignKeyWidget(Country, 'name'))
bookie = fields.Field(column_name='Bookie',
attribute='bookie',
widget=ForeignKeyWidget(Bookie, 'name'))
currency = fields.Field(column_name='Currency',
attribute='stake_currency',
widget=ForeignKeyWidget(Currency, 'name'))
odds = fields.Field(column_name="Odds",
attribute="odds",
widget=DecimalWidget())
status = fields.Field(column_name='Status',
attribute='status',
widget=ForeignKeyWidget(Status, 'name'))
class Meta:
model = Bet
fields = ("id", "date", "time", "sport",
"country",
"competition", "home",
"visitor",
"bookie", "bet", "stake",
"currency",
"odds", "status")
clean_model_instances = True
@classmethod
def field_from_django_field(self, field_name, django_field, readonly):
"""
Returns a Resource Field instance for the given Django model field.
"""
FieldWidget = self.widget_from_django_field(django_field)
widget_kwargs = self.widget_kwargs_for_field(field_name)
field = fields.Field(attribute=field_name, column_name=field_name.replace("__name", "").title(),
widget=FieldWidget(**widget_kwargs), readonly=readonly)
return field
這是來自文檔的導入視圖的屏幕截圖:
您可以看到文本“此導入程序將導入以下字段”,后跟字段名稱。
就我而言,顯式定義的字段首先出現,例如:
country = fields.Field(column_name='Country',
attribute='country',
widget=ForeignKeyWidget(Country, 'name'))
然后是在class Meta fields
定義的其余class Meta fields
:
This importer will import the following fields: Date, Time, Sport, Country, Bookie, Currency, Odds, Status, Id, Competition, Home, Visitor, Bet, Stake
問題是字段的順序不符合我文件中字段的順序,並且數據變得混亂。
僅當文件中有錯誤時才會發生這種情況。
將export_order選項添加到資源的Meta字段中,如下所示:
class Meta:
model = Bet
fields = ("id", "date", "time", "sport",
"country",
"competition", "home",
"visitor",
"bookie", "bet", "stake",
"currency",
"odds", "status")
clean_model_instances = True
export_order = ["Date", "Time", "Sport", "Country",
"Bookie", "Currency", "Odds", "Status",
"Id", "Competition", "Home", "Visitor",
"Bet", "Stake"]
( 或按照您希望的首選順序 )和django-import-export將相應地導入您聲明的字段! 之所以可行,是因為get_fields()調用了export_order,而get_import_fields()和get_export_fields()又調用了該命令,從而影響了兩個流程的整個工作流程。
def export_order = None
def get_fields(self, **kwargs):
"""
Returns fields sorted according to
:attr:`~import_export.resources.ResourceOptions.export_order`.
"""
return [self.fields[f] for f in self.get_export_order()]
def get_import_fields(self):
return self.get_fields()
def get_export_fields(self):
return self.get_fields()
def import_obj(self, obj, data, dry_run):
"""
Traverses every field in this Resource and calls
:meth:`~import_export.resources.Resource.import_field`. If
``import_field()`` results in a ``ValueError`` being raised for
one of more fields, those errors are captured and reraised as a single,
multi-field ValidationError."""
errors = {}
for field in self.get_import_fields():
if isinstance(field.widget, widgets.ManyToManyWidget):
continue
try:
self.import_field(field, obj, data)
except ValueError as e:
errors[field.attribute] = ValidationError(
force_text(e), code="invalid")
if errors:
raise ValidationError(errors)
以上是import_export.resources.py的摘錄。 為了進一步說明,我還建議使用import_export的資源的導入數據工作流文檔和方法。
希望對您有所幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.