【问题标题】:Django autoincrement fieldDjango 自动增量字段
【发布时间】:2018-12-17 08:34:14
【问题描述】:

我试图对某个字段进行自动增量,但不知道正确的方法。我正在使用 postgres 来管理我的数据库:我尝试了 Autofield 数据类型,但它不起作用。我猜 django 正在使用默认的 id 字段,我想用我的 WO_ID 字段替换它。

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 自动增量代码:

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');

【问题讨论】:

  • 如果显得过于粗鲁,我真的很抱歉。正如我所指出的,请阅读 PEP8 风格指南。属性名称应使用snake_case - 所有小写字母,单词除以下划线 (_)。 snake_case 中的单词没有大写。不要在模型类属性中添加前缀 - WO_NightShift 应该只是 nightshiftnight_shift。您已经在类中进行了封装,不需要在属性名称中重复命名空间,这被认为是非常糟糕的做法。
  • 您使用python2 还是python3?对于新项目,强烈建议使用 python2 和 Django 2。在这种情况下,您不应在模型类上定义 __unicode__ 方法,而是使用 __str__ 方法。

标签: django postgresql


【解决方案1】:

默认情况下,Django 为每个模型提供名为 id 的自动增量字段。见https://docs.djangoproject.com/en/2.1/topics/db/models/#automatic-primary-key-fields

如果你想创建一个额外的自增字段,你可以使用AutoFieldhttps://docs.djangoproject.com/en/2.1/ref/models/fields/#django.db.models.AutoField

创建自定义 id 字段

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

这会跳过默认 id 字段的创建并创建名称为 wo_id 的自动增量主字段。

【讨论】:

  • 我尝试了自动字段,但每当我添加新记录时,它都不会自动增加
  • 您想将默认 id 字段重命名为 wo_id 还是拥有两个字段 - id 和 wo_id。因为 Django 只允许每个模型有一个 AutoField...
  • 我想跳过默认id,使用wo_id字段
  • @GentBytyqi 分享您尝试过的代码,检查实际的数据库模型(在 dbms 端),未应用的迁移。
  • 我刚刚尝试了autofield数据类型但是没有用,基本上我有一个html模板,我将编辑代码并包含views.py
猜你喜欢
  • 2022-11-01
  • 1970-01-01
  • 2011-02-10
  • 2017-05-20
  • 2010-10-06
  • 2013-05-21
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多