繁体   English   中英

django 导入导出复合外键

[英]django import-export composite foreign key

我有两个模型: ExternalListSettingsPriorityToolPartner 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM