Администратор Django - экземпляр должен иметь значение первичного ключа, прежде чем можно будет использовать отношение многие ко многим - PullRequest
8 голосов
/ 20 июня 2011

edit: Раньше мне было непонятно, я сохраняю свой объект в админ-панели django, а не в виде.Даже когда я сохраняю объект без отношений «многие ко многим», я все равно получаю ошибку.

У меня есть модель с именем TogglDetails, которая имеет отношение ForeignKey со стандартной моделью django UserMayToManyField связь с моделью с именем Tag.Я зарегистрировал свои модели с администратором django, но когда я пытаюсь сохранить экземпляр TogglDetails, я получаю ошибку в заголовке.

Вот мои модели:

class Tag(models.Model):
    name = models.CharField(max_length=30)

    def __unicode__(self):
        return self.name


class TogglDetails(models.Model):
    token = models.CharField(max_length=100)
    user = models.ForeignKey(User)
    tags = models.ManyToManyField(Tag, blank=True, null=True)

    def __unicode__(self):
        return self.user.username

    class Meta:
        verbose_name_plural = "toggl details"

НасколькоЯ могу сказать, что с моими моделями не должно быть проблем, и администратор django должен просто сохранить экземпляр без проблем.Есть ли что-то очевидное, что я пропустил?

Я использую Django 1.3

Ответы [ 5 ]

4 голосов
/ 26 августа 2011

Ответ на мой вопрос был следующим: Последовательности Postgres без атрибута «ведомый» не возвращают идентификатор в Django 1.3

Последовательности в моей базе данных postgres не имели установленного атрибута «Owned by» и поэтому не возвращали идентификатор при сохранении новой записи в БД.

3 голосов
/ 07 ноября 2011

Как заявили другие пользователи:

Последовательности Postgres без атрибута «ведомый» не возвращают идентификатор в Django 1.3

Последовательности в моей базе данных postgres не имеют «В собственности»по атрибуту set и поэтому не возвращал идентификатор при сохранении новой записи в db

Кроме того: Это, скорее всего, вызвано несовместимым с обратным стороны изменением, которое делает некоторые типы первичных ключей в пользовательских моделях недоступнымидля Джанго 1.3.Для получения дополнительной информации см. Билеты Django trac https://code.djangoproject.com/ticket/13295 и http://code.djangoproject.com/ticket/15682.

Я решил проблему, выполнив следующие команды для затронутых таблиц / последовательностей.

Конкретно запустив команду:

manage.py dbshell
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;

изменить tablename_colname_seq и tablename.colname

0 голосов
/ 01 сентября 2011

Я пробовал Django 1.3 с использованием CPython, с разными настройками базы данных.Я скопировал модели из вопроса и внес некоторые изменения: сначала я добавил

from django.contrib.auth.models import User

вверху файла и поместил ссылку на Tag между кавычками.Это не должно иметь никакого значения.Кроме того, я создал следующий admin.py:

from django.contrib import admin
import models

admin.site.register(models.Tag)
admin.site.register(models.TogglDetails)

Для Sqlite3 описанная проблема не возникает ни для MySQL.Поэтому я попробовал PostgreSQL с серверной частью postgresql_psycopg2.То же самое: я не могу воспроизвести ошибку.

Итак, насколько я могу судить, нет ничего плохого в коде в вопросе.Проблема должна быть в другом месте.

0 голосов
/ 31 августа 2011

У меня тоже была эта проблема, и единственное, что я мог сделать, это сделать поля M2M пустыми и не устанавливать их, пока я не нажму Сохранить и продолжить редактирование.

Я думаю, что это может быть просто фреймворкбородавка, как вы заметите, раздел «Пользователь» на сайте администратора также имеет очень строгое «Вы можете редактировать эти поля только до сохранения модели».

Поэтому я рекомендую принять эту схему и скрытьПоле формы M2M, пока модель не получит первичный ключ.

0 голосов
/ 20 июня 2011

Не дайте нам угадать и добавить сообщение об ошибке в ваш вопрос, это дает большую информацию о том, где он терпит неудачу.

Вы импортировали модель пользователя?

from django.contrib.auth.models import User
...