通过与 django-import-export 相反的 ForeignKey 小部件从字段中获取字段值
Getting a field value from a field via a ForeignKey widget in reverse with django-import-export
我几乎可以正常工作了。
型号:
class Child(models.Model):
parent = models.ForeignKey('project.Parent')
name = models.CharField(max_length=100)
class Parent(models.Model):
text = models.CharField(max_length=100)
资源:
class ParentResource(resources.ModelResource):
children = fields.Field(widget=widgets.ForeignKeyWidget(Parent))
class Meta:
model = Parent
use_transactions = True
fields = ('text', 'children__child__name')
然后视图调用资源并下载它。问题是,名称为空。所以,其他一切都很好,但我无法让 child.name 出现。我错过了什么?
首先,widgets.ForeignKeyWidget
被modelA用来查找相关的modelB,是 modelA.
的外键
即a ChildResource
可以用 widgets.ForeignKeyWidget
来查找 a Parent
,反之则不行。
反向执行,即向上循环 and/or 显示一组 Childs
的一些字段(谁有 ForeignKey Parent
) 来自 ParentResource
,你需要做这样的事情:
from import_export import fields, resources
from .models import Parent
class ParentResource(resources.ModelResource):
children = fields.Field()
class Meta:
model = Parent
use_transactions = True
fields = ('text', 'children')
def dehydrate_children(self, parent):
children = list(parent.child_set.all())
return ','.join([child.name for child in children])
使用dehydrate()
方法。然后,当您导出 ParentResource
时,您将获得一个带有“children”键的数据集对象,其值是以逗号分隔的子项名称列表。
我几乎可以正常工作了。
型号:
class Child(models.Model):
parent = models.ForeignKey('project.Parent')
name = models.CharField(max_length=100)
class Parent(models.Model):
text = models.CharField(max_length=100)
资源:
class ParentResource(resources.ModelResource):
children = fields.Field(widget=widgets.ForeignKeyWidget(Parent))
class Meta:
model = Parent
use_transactions = True
fields = ('text', 'children__child__name')
然后视图调用资源并下载它。问题是,名称为空。所以,其他一切都很好,但我无法让 child.name 出现。我错过了什么?
首先,widgets.ForeignKeyWidget
被modelA用来查找相关的modelB,是 modelA.
即a ChildResource
可以用 widgets.ForeignKeyWidget
来查找 a Parent
,反之则不行。
反向执行,即向上循环 and/or 显示一组 Childs
的一些字段(谁有 ForeignKey Parent
) 来自 ParentResource
,你需要做这样的事情:
from import_export import fields, resources
from .models import Parent
class ParentResource(resources.ModelResource):
children = fields.Field()
class Meta:
model = Parent
use_transactions = True
fields = ('text', 'children')
def dehydrate_children(self, parent):
children = list(parent.child_set.all())
return ','.join([child.name for child in children])
使用dehydrate()
方法。然后,当您导出 ParentResource
时,您将获得一个带有“children”键的数据集对象,其值是以逗号分隔的子项名称列表。