# -*- encoding: utf-8 -*-from django.db.models.fields import Field, IntegerFieldfrom django.core import checks, exceptionsfrom django.utils.translation import ugettext_lazy as _class AutoIncreField(Field):
description = _("Integer")
empty_strings_allowed = False
default_error_messages = {'invalid': _("'%(value)s' value must be an integer."),
}def __init__(self, *args, **kwargs):
kwargs['blank'] = True
super(AutoIncreField, self).__init__(*args, **kwargs)def check(self, **kwargs):
errors = super(AutoIncreField, self).check(**kwargs)# 每张表只能设置一个字段为自增长字段,这个字段可以是主键,也可以不是主键,如果不是主键,则必须设置为一种“键(key)”
# (primary key)也是键(key)的一种,key还包括外键(foreign key)、唯一键(unique key)
errors.extend(self._check_key())return errorsdef _check_key(self):
if not self.unique:return [
checks.Error('AutoIncreFields must set key(unique=True).',
obj=self,
id='fields.E100',
),
]else:return []def deconstruct(self):
name, path, args, kwargs = super(AutoIncreField, self).deconstruct()del kwargs['blank']
kwargs['unique'] = True
return name, path, args, kwargsdef get_internal_type(self):
return "AutoIncreField"
def to_python(self, value):
if value is None:return valuetry:return int(value)except (TypeError, ValueError):raise exceptions.ValidationError(
self.error_messages['invalid'],
code='invalid',
params={'value': value},
)def db_type(self, connection):
return 'bigint AUTO_INCREMENT'
def rel_db_type(self, connection):
return IntegerField().db_type(connection=connection)def validate(self, value, model_instance):
pass
def get_db_prep_value(self, value, connection, prepared=False):
if not prepared:
value = self.get_prep_value(value)
value = connection.ops.validate_autopk_value(value)return valuedef get_prep_value(self, value):
value = super(AutoIncreField, self).get_prep_value(value)if value is None:return None
return int(value)def contribute_to_class(self, cls, name, **kwargs):
assert not cls._meta.auto_field, "A model can't have more than one AutoIncreField."
super(AutoIncreField, self).contribute_to_class(cls, name, **kwargs)
cls._meta.auto_field = selfdef formfield(self, **kwargs):
return None
from django.db import models# Create your models here.
class Student(models.Model):
student_id = models.BigAutoField(primary_key=True)
这是model定义。
默认情况下,自增id都是从1开始计数的。如果你想从10001开始,就需要手动创建一个对象,为其设置student_id为10001,以后创建对象的studeng_id就从10002开始自动增加。
first_student =models.Student(student_id=10001)
first_student.save()
更多相关内容参考刘江的Django教程
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)