Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django autoincrement field

I was trying to make an auto-increment for a certain field and don't know the proper way to do it. I am using postgres for administrating my database: I tried the Autofield data type but it didn't work. I guess django is using a default id field and I would like to replace that with my WO_ID field.

models.py

class Workorder(models.Model): 
    WO_ID = models.BigIntegerField(blank=True, primary_key=True)
    WO_DateDefWO = models.DateField(default=datetime.now)
    WO_DateSched = models.DateField(blank=True, null=True)
    WO_DateFinished = models.DateField(blank=True, null=True)
    WO_ST_ID_Sign = models.BigIntegerField(blank=True, null=True)
    WO_Status_ID = models.BigIntegerField(blank=True, null=True, default=1, choices=STATUS_CHOICES)
    WO_Type_ID = models.BigIntegerField(blank=True, null=True, default=1, choices=TYPE_CHOICES)
    WO_Comments = models.CharField(max_length=254, blank=True, null=True)
    WO_Nav_ID = models.BigIntegerField(blank=True, null=True)
    WO_Nav_Kons_ID = models.CharField(max_length=12, blank=True, null=True)
    WO_Nav_Name = models.CharField(max_length=254, blank=True, null=True)
    WO_Nav_CustAdr = models.CharField(max_length=254, blank=True, null=True)
    WO_Nav_Debt = models.FloatField(blank=True, null=True)
    WO_Nav_PropCode = models.CharField(max_length=254, blank=True, null=True)
    WO_Nav_DepCode = models.CharField(max_length=254, blank=True, null=True)
    WO_Nav_PhoneNo = models.CharField(max_length=254, blank=True, null=True)
    WO_Nav_ReasonCompl = models.CharField(max_length=254, blank=True, null=True)
    WO_NightShift = models.BooleanField(default=False)
    WO_Priority = models.BigIntegerField(blank=True, null=True)
    WO_RE_ID = models.BigIntegerField(blank=True, null=True)
    WO_MapUrl = models.CharField(max_length=254, blank=True, null=True)

    def __unicode__(self):
        return self.WO_ID

views.py

from django.shortcuts import render, get_object_or_404, redirect
from django import forms
from django.views.generic import TemplateView
from django.core.serializers import serialize
from django.http import HttpResponse
from MMS.models import Workorder
from MMS import forms
from MMS.forms import CreateWorkorder
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from . import forms


def workorders_list(request):
    workorders_all = Workorder.objects.all().values_list('WO_ID', flat=True)
    return render(request, "workorders_list.html")

def home_page(request):
    return render(request, "home_page.html")

def workorder_create(request):
    if request.method == "POST":
        form = CreateWorkorder(request.POST)
        if form.is_valid():
            CreateWorkorder_item = form.save(commit=False)
            CreateWorkorder_item.save()
            return redirect('/workorder/' + str(CreateWorkorder_item.WO_ID) + '/')
    else:
        form = CreateWorkorder()
    return render(request, 'workorders/workorder_create.html', {'form': form})


def workorder_edit(request, id=None):
    item = get_object_or_404(Workorder, WO_ID=id)
    form = CreateWorkorder(request.POST or None, instance=item)
    if form.is_valid():
        form.save()
        return redirect('/workorder/' + str(item.WO_ID) + '/')
    return render(request, 'workorders/workorder_edit.html', {'form': form})


def workorder(request, id):
    workorder = Workorder.objects.get(WO_ID=id)
    return render(request, 'workorders/workorder.html', {'workorder': workorder})

postgresql autoincrement code:

CREATE SEQUENCE public.MMS_workorder_id_seq
    INCREMENT 1
    START 1
alter table MMS_workorder ALTER COLUMN "WO_ID" SET DEFAULT nextval('MMS_workorder_id_seq');
like image 254
Gent Bytyqi Avatar asked Feb 17 '26 12:02

Gent Bytyqi


1 Answers

By default, Django gives each model the autoincrement field called id. See https://docs.djangoproject.com/en/2.1/topics/db/models/#automatic-primary-key-fields

If you want to create an extra auto increment field, you can use AutoField https://docs.djangoproject.com/en/2.1/ref/models/fields/#django.db.models.AutoField

Create custom id field

class MyModel(models.Model):
    wo_id = models.AutoField(primary_key=True)

This skips creation of default id field and creates autoincrement primary field with name wo_id.

like image 101
quick Avatar answered Feb 20 '26 01:02

quick