i need maximum value of particular field in database, increment 1 , becomes new order number.
the way is:
def generate_order_number(self): q_number = order.objects.all().aggregate(max('number'))['number__max'] if q_number: q_number += 1 else: q_number = 1 return q_number this code works fine until order number 10. however, when order number 11 attempted, aggregate query returns max value 9 , thus, function returns 10 new order number - fails entire process (number unique in database).
why happening?
i using django/postgresql combination. database entry number is:
number = models.bigintegerfield( _("quotation number"), db_index=true, unique=true) also, when try directly manipulate database order number, error is:
programmingerror @ /admin/order/order/21/ operator not exist: character varying = integer line 1: ..._order" ("order_order"."number" = 11 , n... ^ hint: no operator matches given name , argument type(s). might need add explicit type casts. how fix this?
the postgresql serial datatype internally creates both smallint/int/bigint column , sequence. making equivalent normal int column default set sequence.
for example, this:
create table tablename ( colname serial ); internally results in this:
create sequence tablename_colname_seq; create table tablename ( colname integer not null default nextval('tablename_colname_seq') ); alter sequence tablename_colname_seq owned tablename.colname; this question comes in, while plain create sequence adds simple sequence increments 1 , never go down. using setval can reset sequence current value reuse old numbers.
do note can result in duplicate key constraints since primary key still unique if duplicate key constraints, reset sequence range isn't in use yet (select max(colname)+1 tablename should give correct startpoint).
Comments
Post a Comment