Django удалить объект, который имеет строку в качестве первичного ключа - PullRequest
2 голосов
/ 24 февраля 2011

У меня есть следующая модель

class Staff(models.Model):
    username = models.OneToOneField(Person, primary_key=True)
    room = models.CharField(blank=True, max_length=12)

Когда я запускаю следующий код, я получаю ошибку Truncated incorrect DOUBLE value: 'lacc1'

s = Staff.objects.get(pk = 'lacc1').delete()

Я предполагаю, что это как-то связано с первичным ключомбудучи строкой.Кто-нибудь знает, как я могу решить эту проблему.

Это только на удаляет.Если я просто хочу получить объект с помощью get или filter, он работает нормально.В БД также есть объект с pk lacc1, так что это не проблема.

РЕДАКТИРОВАТЬ

Person Class

class Person(models.Model):
    username = models.CharField(primary_key=True, max_length=12)
    title = models.CharField(max_length=25)
    forenames = models.CharField(max_length=50)
    surname =  models.CharField(max_length=50)

1 Ответ

3 голосов
/ 24 февраля 2011

Ваш первичный ключ - это не строка, а целое число.

username = models.OneToOneField(Person, primary_key=True)

username здесь это не CharField, а OneToOneField, что означает отношение кPerson объектная модель, означающая поле, содержащее идентификатор строки этого экземпляра лица в таблице персонала.

Вы можете переименовать ее следующим образом:

person = models.OneToOneField(Person, primary_key=True)

Ипредполагая, что ваш объект Person имеет атрибут username, вы можете удалить свой персонал следующим образом:

s = Staff.objects.get(person__username='lacc1').delete()

Однако вы должны знать, что это означает JOIN в поле person_id ифильтр в поле Staff username, который, вероятно, не проиндексирован.Это будет медленнее, чем вы ожидали, но я сомневаюсь, что это вызовет какие-то проблемы.

...