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