Django: экземпляр должен иметь значение первичного ключа перед отношением многие ко многим - PullRequest
11 голосов
/ 23 мая 2011

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

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.

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

Ответы [ 4 ]

27 голосов
/ 23 мая 2011

Вам необходимо сохранить экземпляр модели перед добавлением любых полей 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.Если вы хотите назначить его вручную, как вы делаете, вам нужно добавить его отдельно, как мой код выше.

1 голос
/ 03 августа 2012

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

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

Удачи!

0 голосов
/ 23 мая 2011

попробуйте с этим заказом:

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
0 голосов
/ 23 мая 2011

Сохраните busi перед попыткой присвоить busi.business_type.

...