Django импорт-экспорт составной внешний ключ

У меня есть две модели: 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

Прежде всего, я изменил файл csv, добавив поле setting:

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(instance, row, dry_run, **kwargs)

Я сделал это, изменив файл csv и добавив setting к fields

Вернуться на верх