Проблемы с обновлением записей в django-admin - PullRequest
1 голос
/ 18 ноября 2009

Я использую Django (в частности, django-admin) в качестве панели администратора для сайта, который использует PHP для клиентских функций. Я бездельничал, заставляя администратора выглядеть именно так, как я хочу, и пока все хорошо. Однако я столкнулся с несколькими проблемами, которые мне нужно решить.

Вот модели, с которыми я работаю:

class Permissions(models.Model):
    id = models.IntegerField(primary_key=True)
    league_key = models.CharField(max_length=15) 
    commissioner_id = models.ForeignKey(Accounts, db_column='commissioner_id',
                                        to_field='id')
    status = models.IntegerField()
    key = models.CharField(max_length=50)
    publisher_key = models.CharField(max_length=25)
    publisher_display_name = models.CharField(max_length=50)
    base_league = models.ForeignKey('self', db_column='id')
    share = models.IntegerField()
    default_fixture_key = models.CharField(max_length=50)

    def __unicode__(self):
        return self.publisher_key + ' / ' + self.league_key

    class Meta:
        db_table = u'permissions'
        verbose_name = 'Permissions'
        verbose_name_plural = 'Permissions'

class PermissionsAdmin(admin.ModelAdmin):
    list_display = ('league_key', 'publisher_key', 'commissioner_id', 'status',
                    'base_league', 'share', 'default_fixture_key')
    list_display_links = ('league_key','commissioner_id', 'base_league')
    exclude = ('id',)

Первая проблема заключается в том, что административная форма для редактирования существующей записи помечает одно из полей как обязательное. Как мне сообщить django-admin, когда поле является обязательным и не обязательным?

Вторая проблема, с которой я сталкиваюсь, заключается в том, что когда я говорю «Сохранить эту запись», я получаю следующую ошибку: двойное значение ключа нарушает уникальное ограничение «permissions_pkey». Это заставляет меня думать, что Django не делает обновления, он пытается сделать INSERT

Мне также пришло в голову, что это может быть проблемой, связанной с Postgresql. permissions_pkey является ограничением для этой таблицы, отслеживая последовательность, используемую для автоматического увеличения идентификатора для этой таблицы

Хотя документы Django потрясающие, у них, похоже, нет информации, которая мне нужна, чтобы это выяснить.

(РЕДАКТИРОВАТЬ: копаясь в трассировке стека, я нашел этот удивительный маленький самородок:

sql 
'UPDATE "permissions" SET "league_key" = E\'l.1258472565 \', "commissioner_id" = 7,
 "status" = 0, "key" = E\'cfcd208495d565ef66e7dff9f98764da \', 
"publisher_key" =     E\'chrishartjes.com \', 
"publisher_display_name" = E\'Chris Hartjes Free Press \', 
"id" = 744, "share" = 0, 
"default_fixture_key" = E\'\' WHERE "permissions"."id" = 745 '

что заставляет меня думать, что моя маленькая запись ForeignKey сама по себе вызывает проблему)

Ответы [ 3 ]

2 голосов
/ 18 ноября 2009

Проблема 1: см. Документацию по настройке null и blank. Краткая история: установка null позволит БД хранить нулевое значение. Здесь вы (скорее всего) хотите установить для blank значение True, чтобы при проверке модели это поле не требовалось. Если поле не является CharField, вам также следует установить для null значение True. Смотрите документы здесь: http://docs.djangoproject.com/en/dev/ref/models/fields/#field-options

Проблема 2: Я считаю, что вы хотите здесь AutoField, а не IntegerField. Разница лишь в том, что AutoField автоматически создаст новый идентификатор для вас при сохранении нового объекта. Смотрите документы здесь: http://docs.djangoproject.com/en/dev/ref/models/fields/#autofield

Редактировать: (из моего комментария) Снова глядя, я вижу, что ошибка ссылается на permissions_pkey. Попробуйте заменить поле id на pkey = AutoField(primary_key=True).

1 голос
/ 18 ноября 2009
  1. В поле введите null=True в конструкторе поля, если поле не требуется. Редактировать: комментатор говорит blank=True - он, вероятно, прав - у меня нет документов передо мной.
  2. Это делает вставку, если идентификатор пуст, и обновление, если идентификатор имеет значение. Не знаю, где происходит сохранение, о котором вы говорите, но эта информация может помочь. (есть удаленный ответ, который указывает, что исключение ('id'), вероятно, вызывает эту проблему - я думаю, что это также верно)

Кроме того, я согласен с документами. Если вы можете читать Python, я настоятельно рекомендую просто прочитать исходный код Django для области, которую вы хотите выяснить. Источник - один из самых хороших, самых читаемых источников, которые я когда-либо читал. У меня никогда не было проблем с тем, чтобы просто заскочить и прочитать это - это почти так же хорошо, как документ.

0 голосов
/ 19 ноября 2009
  1. null = True, пусто = True

  2. Вам не нужно явно указывать столбец «id» в модели разрешений, я полагаю, именно это и вызывает вашу вторую проблему.

...