Django bulk_create не устанавливает поле с вариантами выбора

В моем файле model.py у меня есть базовый и премиум купон, как показано ниже.

coupon_types = (
    ("Basic", "basic"),
    ("Premium", "premium"),
)


class Coupon(Stamp):
    ...
    type = models.CharField(choices=coupon_types, max_length=256, default=coupon_types[0], null=True, blank=True)

В приведенном ниже коде я пытаюсь создать объекты купонов в базе данных

class ClassName:
    ...
    # Some attributes and methods
    ...
    def __construct_initiator_object(self, **kwargs):
        objs = [
            self.initiator(
                ...
                ...
                type=coupon_types[0] if self.coupon_type.lower() == 'basic' else coupon_types[1]
            )
            for code in self.coupons
        ]
        return objs

    @transaction.atomic
    def __create__(self):
        objs = self.__construct_initiator_object()
        create_objs = Coupon.objects.bulk_create(objs)

        return create_objs

Теперь моя проблема заключается в том, что всякий раз, когда я вызываю метод create, bulk_create устанавливает все остальные поля, но не поле type. Я не знаю, может это потому, что у меня есть choices=coupon_types в поле type. Помогите, пожалуйста, как это преодолеть.

Я думаю, сначала вам нужно изменить ваш выбор на что-то вроде:

class Coupon:
    BASIC = "Basic"
    PREMIUM = "Premium"
    coupon_types = (
        (BASIC, "basic"),
        (PREMIUM, "premium"),
        )
    ...
    type = models.CharField(choices=coupon_types, max_length=256, default=BASIC)

Также обратите внимание, что я удалил null и blank из этого поля, потому что вы предоставили значение по умолчанию для этого поля и они вам не нужны. Пожалуйста, убедитесь, что ваша база данных обновлена, выполнив команды makemigrations и migrate.

и затем измените __construct_initiator_object на

def __construct_initiator_object(self, **kwargs):
    objs = [
        self.initiator(
            ...
            ...
            type=Coupon.BASIC if self.coupon_type.lower() == 'basic' else Coupon.PREMIUM
        )
        for code in self.coupons
    ]
    return objs

Поскольку я не смог найти ваш метод initiator, пожалуйста, убедитесь, что вы добавляете все (т.е. тип) к объектам в этом методе. Надеюсь, это решит вашу проблему.

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