我正在尝试将我的模型添加到我的数据库中,但我不确定为什么会出现以下错误。
" 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')
答案 0 :(得分:0)
来自primary_key
文档:
primary_key
Field.primary_key
如果True
,此字段是该字段的主键 模型。如果您没有为模型中的任何字段指定
primary_key=True
, Django会自动添加AutoField
来保存主键,所以 您不需要在任何字段上设置primary_key=True
,除非 您想要覆盖默认的主键行为。有关更多信息,请参阅 自动主键字段。
primary_key=True
隐含null=False
和unique=True
。 只有一个小学 对象上允许使用密钥。
如果您首次创建模型(和迁移),则会出现此错误的一个原因是,使用django添加的默认主键应用迁移。
接下来,您决定将其他字段设置为主键,并创建迁移,现在当您尝试应用它时,您将收到此错误。
它与序列化没有关系,因为错误发生在数据库级别。
您有几种方法可以解决此问题:
删除(或手动调整)您的迁移,以便您的模型只有一个主键。
保留默认主键,并添加更改device_key
以强制执行唯一性并(可选)在其上创建索引:
device_key = models.CharField(max_length=32,
unique=True, null=False, db_index=True)