[英]django import-export composite foreign key
我有两个模型: ExternalListSettings
和PriorityToolPartner
。 PriorityToolPartner
有 ForeignKey 到ExternalListSettings
。 ExternalListSettings
具有复杂的主键: import_date
+ partner
。
CSV 文件如下所示:
import_date, partner, hotel_name, slug, bookings, num_in_sortorder
如何导入PriorityToolPartner
并将['import_date', 'partner']
组合到 ForeignKey 到ExternalListSettings
模型?
这是我的模型:
class ExternalListSettings(DiModel):
class Meta:
verbose_name_plural = "External List Settings"
unique_together = ['import_date', 'partner']
import_date = models.DateField(
blank=False,
null=False,
)
partner = models.CharField(
max_length=200,
blank=False,
null=False,
)
is_top = models.BooleanField(
blank=True,
null=False,
default=False,
)
class PriorityToolPartner(DiModel):
setting = models.ForeignKey(
ExternalListSettings,
null=False,
blank=False,
on_delete=models.CASCADE,
default=0,
)
hotel_name = models.CharField(
max_length=200,
blank=False,
null=False,
)
slug = models.CharField(
max_length=300,
blank=False,
null=False,
)
bookings = models.IntegerField(
blank=True,
null=True,
)
num_in_sortorder = models.IntegerField(
blank=True,
null=True,
)
您可能可以通过ForeignKeyWidget
来做到这一点。
class CompositeForeignKeyWidget(widgets.ForeignKeyWidget):
def clean(self, value, row=None, **kwargs):
k1 = row["import_date"]
k2 = row["partner"]
return self.model.objects.get(import_date=k1, partner=k2)
class PriorityToolPartnerResource(ModelResource):
setting = Field(widget=CompositeForeignKeyWidget(ExternalListSettings))
class Meta:
model = PriorityToolPartner
首先,我通过添加setting
字段修改了 csv 文件:
import_date, partner, hotel_name, slug, bookings, num_in_sortorder, setting
并将setting
留空。
我的admin.py
:
class CompositeForeignKeyWidget(widgets.ForeignKeyWidget):
def clean(self, value, row=None, **kwargs):
k1 = row["import_date"]
k2 = row["partner"]
return self.model.objects.get(import_date=k1, partner=k2)
class PriorityToolPartnersResource(resources.ModelResource):
setting = Field(
attribute='setting',
widget=CompositeForeignKeyWidget(ExternalListSettings)
)
class Meta:
model = PriorityToolPartner
skip_unchanged = True
report_skipped = True
exclude = ('id',)
import_id_fields = (
'import_date',
'partner',
'hotel_name',
'slug',
'bookings',
'num_in_sortorder',
)
fields = (
'setting',
'hotel_name',
'slug',
'bookings',
'num_in_sortorder',
)
def get_import_fields(self):
return [self.fields[f] for f in ['setting', 'hotel_name', 'slug', 'bookings', 'num_in_sortorder']]
确保外键字段在之前的row
中表示
self.import_obj(实例,行,dry_run,**kwargs)
我通过修改 csv 文件并将setting
添加到fields
来实现
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.