我正在为购物车创建一个Order
模型,我需要创建一个在下订单时自动递增的字段:
class Order(models.Model):
cart = models.ForeignKey(Cart)
add_date = models.DateTimeField(auto_now_add=True)
order_number = models.IntegerField()
enable = models.BooleanField(default=True)
如何使IntegerField
自动递增?
9条答案
按热度按时间dm7nw8vv1#
因 Django
1:Django模型类有默认字段
id
,是自动递增字段。2:您可以使用
AutoField
字段定义自己的自动增量字段。db设计
如果你想使用django的默认id作为增量字段。
db设计
iqih9akk2#
在django中,每个模型的id字段默认为自动递增,但如果你手动使用自动递增,你只需要在你的模型
AutoField
中指定即可。你可以在Django文档中阅读更多关于自动字段的信息
wr98u20j3#
或**
区别在于:
第一个表具有主键
belly_id
(指定为AutoField
),第二个表具有主键id
(隐式)。我认为没有必要直接使用这个;* 如果您不指定 *,主键字段将自动添加到您的模型中。否则,请查看Django文档中的AutoField以获取更多关于
AutoField
的详细信息。q8l4jmvw4#
编辑日期:修复了代码中的错误,即如果数据库中没有
YourModel
条目,则停止其工作。有很多地方提到了应该如何使用自动域,当然,在可能的情况下应该使用它。
但是,您自己实现自动递增字段也是有正当理由的(例如,如果您需要一个从500开始的id,或者出于某种原因以十为单位递增)。
在您的
models.py
中fiei3ece5#
您可以创建一个自动字段。以下是
请记住Django不允许在一个模型中有多个自动字段,在您的模型中您已经有一个自动字段作为主键(默认设置),所以您必须覆盖模型的保存方法,并可能从表中获取最后插入的记录,相应地增加计数器并添加新记录。
请确保该代码是线程安全的,因为在多个请求的情况下,您可能最终会尝试为不同的新记录插入相同的值。
wkyowqbh6#
你可以重写Django保存方法官方文档中的相关内容。
代码的修改版本:
另一种方法是使用信号。更多:
1.官方Django文档关于预保存
ws51t4hk7#
我所需要的:具有固定整数数的文档编号,其作用类似于
AutoField
。我的搜索带我到处包括。这一页。
最后我做了这样的事:
我创建了一个表,其中
DocuNumber
字段为IntegerField,具有以下属性:max_length=6
primary_key=True
unique=True
default=100000
max_length
值可以是所需的任何值(以及相应的default=
值)。创建上述模型时发出警告,我可以忽略。
然后,创建了一个文档(虚拟),如预期的那样,该文档的整数字段值为100000。
之后将型号关键字字段更改为:
AutoField
max_length
和default
属性primary_key = True
属性创建的下一个(所需文档)的值为100001,后续数字递增1。
到目前为止一切顺利。
n3h0vuf28#
您可以使用自动递增的默认主键(id)。
注意:当您使用第一个设计时,即使用默认字段(id)作为主键时,通过提及列名来初始化对象。
然后初始化,
如果您以下列方式初始化,
那么python将尝试设置id =“XYZ”,这将在数据类型上给予您错误。
eanckbw99#
如果不打算将自动增量字段用作主键,则可以定义一个整型字段,并在保存()方法中更新此整型字段。
如果我们不在这里使用self._state.adding,那么在更新过程中顺序也会自动增加,我们只查询self._state.adding,即我们想在创建过程中增加顺序。