Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django模型未自动创建ID_Django_Python 3.x - Fatal编程技术网

Django模型未自动创建ID

Django模型未自动创建ID,django,python-3.x,Django,Python 3.x,我试图保存一个简单的设备模型,它有三个字段:用户名、设备名称和制造商 查看数据库中的模型,添加了一个ID字段作为主键。此字段应自动递增 在阅读了一些文档之后,我尝试重新创建以下内容: Auto-incrementing primary keys¶ If a model has an AutoField — an auto-incrementing primary key — then that auto-incremented value will be calculated and sav

我试图保存一个简单的设备模型,它有三个字段:用户名、设备名称和制造商

查看数据库中的模型,添加了一个ID字段作为主键。此字段应自动递增

在阅读了一些文档之后,我尝试重新创建以下内容:

Auto-incrementing primary keys¶

If a model has an AutoField — an auto-incrementing primary key — then that 
auto-incremented value will be calculated and saved as an attribute on your 
object the first time you call save():

>>> b2 = Blog(name='Cheddar Talk', tagline='Thoughts on cheese.')
>>> b2.id     # Returns None, because b doesn't have an ID yet.
>>> b2.save()
>>> b2.id     # Returns the ID of your new object.
对我的设备型号执行此操作时:

>>> d = Device("username123", "device12", "manufact12")
>>> d.id
>>> 'username123'
如果我试图保存此模型,将出现以下错误:

ValueError: invalid literal for int() with base 10: 'username123'
因此,它试图将“username123”保存为ID。如果我创建以下设备:

>>> d = Device("1", "username123", "device12", "manufact12")
它创建的设备没有问题

有人能解释为什么会这样吗

编辑:看到第一个回复后,我的帖子似乎不清楚。这是我来自Django的模型:

class Device(models.Model):
    username = models.CharField(max_length=100)
    device_name = models.CharField(max_length=100)
    manufacturer = models.CharField(max_length=100)

它没有ID。正如我在帖子中所说的,当我尝试创建没有ID的模型时(正如我预期的那样),它会给我一个错误。如果我显式地声明一个ID,它就可以工作,但正如你所说的,这不是应该工作的方式

您需要了解自动递增的含义。这意味着它是一个自身增加的整数,所以您无需在每次创建数据库记录时为其分配新的整数。如果插入第一条记录,数据库将自动将其id设置为
1
。下次插入记录时,数据库会给它id
2
,依此类推

您试图将
username123
赋予id字段,django(以及任何人)都无法知道
username123
的下一个可用id是什么

因此,最好的做法是:永远不要显式地为模型对象提供id,因为数据库将为您生成一个id。我希望这是有道理的

编辑:

决不能以这种方式创建对象:

d = Device("username123", "device12", "manufact12")
对于sql语句和django来说,这也是一种常见的错误做法:不指定接受哪个值的字段。如果以后更改了模型,则会将值指定给错误的字段。始终这样做:

d = Device(field1="username123",
           field2="device12",
           field3="manufact12")

同样为了完整性,您的错误告诉您:因为您没有指定将哪个值分配给哪个字段,所以我会按顺序分配它们,所以第一个值应该分配给
id
。但是,由于
id
字段是一个整数字段(自动递增),因此我将尝试使用
int()
将其转换为整数并存储值。但是显然
int(“username123”)
是无效的语句,因此出现了错误。

是的,您的编辑修复了这个问题。有趣。我仍然不明白为什么A)希望我指定ID,或者B)如果我没有指定ID,就给我一个错误。Django文档中没有一个谈到指定ID,就好像它是在保存模型时创建的一样。见鬼,就连我上面从Django docs中给出的例子也显示了我刚才所描述的。太好了,谢谢你的完整答案。干得好!我没有代表投票给你,但这是你应得的!