django怎样获得框架自动定义的自增id字段

django怎样获得框架自动定义的自增id字段,第1张

django自定义字段类型,实现非主键字段的自增

# -*- 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

Django的表单验证框架可以从数据模型自动生成HTML表单,还可在与数据存储区交互的同时无缝处理通过表单输入的信息。要在Google App Engine上使用Django Forms,参考这篇文章在使用过程中会遇到一个问题,比如你在定义一个数据模型Book


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11907793.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-19
下一篇2023-05-19

发表评论

登录后才能评论

评论列表(0条)

    保存