Django - syncdb:table有多个主键

时间:2014-12-15 11:25:44

标签: python django sqlite

我正在尝试将我的模型添加到我的数据库中,但我不确定为什么会出现以下错误。

" sqlite3.OperationalError:table" device_registration_device"有多个主键"

我的模特是

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

class Device(models.Model):
    owner = models.ForeignKey(User)
    device_key = models.CharField(max_length=32, primary_key=True)
    device_type = models.CharField(max_length=32)

我以为我这里只指定了一个primary_key(device_key)?

[编辑]好的,我认为这可能与我试图在这个模型中使用序列化器的事实有关。?

class DeviceSerializer(serializers.ModelSerializer):

    class Meta:
        model = Device
        fields = ('device_key')

1 个答案:

答案 0 :(得分:0)

来自primary_key文档:

  

primary_key

     

Field.primary_key如果True,此字段是该字段的主键   模型。

     

如果您没有为模型中的任何字段指定primary_key=True,   Django会自动添加AutoField来保存主键,所以   您不需要在任何字段上设置primary_key=True,除非   您想要覆盖默认的主键行为。有关更多信息,请参阅   自动主键字段。

     

primary_key=True隐含null=Falseunique=True只有一个小学   对象上允许使用密钥。

如果您首次创建模型(和迁移),则会出现此错误的一个原因是,使用django添加的默认主键应用迁移。

接下来,您决定将其他字段设置为主键,并创建迁移,现在当您尝试应用它时,您将收到此错误。

它与序列化没有关系,因为错误发生在数据库级别。

您有几种方法可以解决此问题:

  1. 删除(或手动调整)您的迁移,以便您的模型只有一个主键。

  2. 保留默认主键,并添加更改device_key以强制执行唯一性并(可选)在其上创建索引:

    device_key = models.CharField(max_length=32,
                                  unique=True, null=False, db_index=True)