Django: экземпляр должен иметь значение первичного ключа перед отношением "многие ко многим"

Это моя модель

class Business(models.Model):
    business_type = models.ManyToManyField(BusinessType)
    establishment_type = models.ForeignKey(EstablishmentType)
    website = models.URLField()
    name = models.CharField(max_length=64)

    def __unicode__(self):
        return self.name

на мой взгляд, я пытаюсь сохранить запись следующим образом:

business = BusinessForm(request.POST or None)
if business.is_valid():
            busi = business.save(commit=False)
            bt = BusinessType.objects.get(id=6)
            busi.business_type = bt
            et = EstablishmentType.objects.get(id=6)
            busi.establishment_type = et
            busi.save()

Однако это дает мне ошибку

'Business' instance needs to have a primary key value before a many-to-many relationship can be used.

Как мне сохранить это?

Ответ 1

Вам нужно сохранить экземпляр модели перед добавлением каких-либо полей m2m. Помните, что вам нужно добавить поле m2m с помощью метода .add(), а не назначать его прямо в поле, как вы это делаете.

if business.is_valid():
    busi = business.save(commit=False)
    et = EstablishmentType.objects.get(id=6)
    busi.establishment_type = et
    busi.save()
    bt = BusinessType.objects.get(id=6)
    busi.business_type.add(bt)

Обратите внимание, что метод save_m2m доступен в объекте modelform, когда вы выполняете form_obj.save(commit=False). Если в форме модели были указаны данные m2m, вы должны использовать метод save_m2m. Если вы хотите назначить его вручную, как вы делаете, вам нужно добавить его отдельно, как мой код выше.

Ответ 2

Если кто-то там все еще ищет ответ на этот вопрос, у меня была такая же проблема, и я не мог найти решение нигде.

Вот где я поступил не так: В моей модели я переопределял метод save(), чтобы не сохранять данные в моей базе данных. Это кажется очевидным ретроспективно, но переопределение метода save() вызывало проблему, потому что мой первичный ключ никогда не генерировался.

Удачи!

Ответ 3

Сохраните busi, прежде чем пытаться назначить busi.business_type.

Ответ 4

попробуйте выполнить этот порядок:

if business.is_valid():
            busi = business.save(commit=False)
            et = EstablishmentType.objects.get(id=6)
            busi.establishment_type = et
            busi.save() #with commit == true
            bt = BusinessType.objects.get(id=6)
            busi.business_type = bt
            busi.save() #here you save many to many