Django删除具有字符串作为主键的对象

时间:2011-02-24 13:44:12

标签: django django-models django-queryset

我有以下型号

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的对象,所以这不是问题。

修改

人类

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 个答案:

答案 0 :(得分:3)

您的主键不是字符串,而是一个int。

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

username这里不是CharField而是OneToOneField,这意味着与Person对象模型的关系,这意味着包含此人行的ID的字段人员表中的实例。

您可能希望以这种方式重命名:

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

并且,假设您的Person对象具有username属性,您可以通过以下方式删除您的员工:

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

但是,您必须知道这意味着JOIN字段上的person_id和工作人员username字段上的过滤器,该字段可能未编入索引。它会比你想象的慢,但我怀疑它应该有任何麻烦。