Django удалить объект, который имеет строку в качестве первичного ключа

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

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, он работает нормально. В БД также есть объект с пк lacc1 так что это не проблема.

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

Персональный класс

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 ответ

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

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

Другие вопросы по тегам