from itertools import chain from django.contrib.auth.models import BaseUserManager, AbstractBaseUser from django.db import models from django.utils import six from django.utils.encoding import python_2_unicode_compatible from imagekit.models import ProcessedImageField from imagekit.processors import ResizeToFill from Ansjer.config import SERVER_DOMAIN class PermissionsManager(models.Manager): use_in_migrations = True def get_by_natural_key(self, permName): return self.get( permName=permName ) class RoleManager(models.Manager): """ The manager for the auth's Role model. """ use_in_migrations = True def get_by_natural_key(self, roleName): return self.get(roleName=roleName) class UserManager(BaseUserManager): def create_user(self, username, password, userID, is_active, user_isValid, **extra_fields): user = self.model( username=username, userID=userID, is_active=is_active, user_isValid=user_isValid, **extra_fields ) user.set_password(password) user.save(using=self._db) role = Role.objects.get(rid=1) user.role.add(role) return user def create_superuser(self, username, password, userID, is_active, user_isValid, **extra_fields): # extra_fields.setdefault('is_superuser', is_superuser) is_superuser = extra_fields.get('is_superuser', None) if is_superuser != 100 and is_superuser != 1: raise ValueError('Superuser must have is_superuser=1 or 100.') return self.create_user(username, password, userID, is_active, user_isValid, **extra_fields) @python_2_unicode_compatible class Permissions(models.Model): permName = models.CharField(blank=True, null=True, max_length=32, unique=True, verbose_name=u'权限名称') description = models.CharField(blank=True, null=True, max_length=128, verbose_name=u'描述信息', default='') objects = PermissionsManager() def __str__(self): return "%s" % ( six.text_type(self.description)) class Meta: ordering = ['permName'] db_table = 'permissions' verbose_name = u'role permission' verbose_name_plural = verbose_name unique_together = (('permName'),) def natural_key(self): return (self.permName) class Role(models.Model): rid = models.SmallIntegerField(primary_key=True, unique=True, verbose_name=u'用户角色组ID') roleName = models.CharField(max_length=32, unique=True, default='User', verbose_name=u'角色名称') permission = models.ManyToManyField(to='Permissions', blank=True, verbose_name=u'权限', db_table='role_permissions') Description = models.TextField(blank=True, default='', verbose_name=u'描述信息') objects = RoleManager() class Meta: ordering = ['roleName'] db_table = 'role' verbose_name = u'用户角色' verbose_name_plural = verbose_name def __str__(self): return self.roleName def natural_key(self): return (self.roleName,) def get_all_permission(self): perms = self.permission.all() permslist = [] if self.rid == 100: perms = Permissions.objects.all() for perm in perms: permslist.append(perm.permName) return permslist else: permlist_tmp = [] for perm in perms: permlist_tmp.append(perm.permName) permSet = set(permlist_tmp) permslist = list(permSet) permslist.sort() return permslist class Device_User(AbstractBaseUser): userID = models.CharField(blank=True, max_length=32, primary_key=True, verbose_name=u'用户ID', unique=True) role = models.ManyToManyField(to='Role', blank=True, verbose_name=u'用户角色', db_table='user_role') username = models.CharField(max_length=64, verbose_name=u'用户名', default='', blank=True) password = models.CharField(max_length=128, verbose_name=u'密码') userEmail = models.EmailField(max_length=64, verbose_name=u'邮箱', default='', blank=True) # 实际的路径就是 MEDIA_ROOT/Image/filename,所以可用upload_to来指定文件存放的前缀路径 userIconPath = ProcessedImageField(blank=True, upload_to='User/Images/', default='static/User/default.png', verbose_name=u'头像', # 图片将处理成85x85的尺寸 processors=[ResizeToFill(85, 85)], ) userIconUrl = models.URLField(blank=True, max_length=128, default=SERVER_DOMAIN + 'account/getAvatar/User/defaultUser.png') NickName = models.CharField(blank=True, max_length=64, default='', verbose_name=u'用户昵称') is_superuser = models.IntegerField(blank=True, default=0, verbose_name=u'用户类型') is_active = models.BooleanField(blank=True, default=False, verbose_name=u'用户活动状态') data_joined = models.DateTimeField(blank=True, verbose_name=u'加入时间', auto_now_add=True) last_login = models.DateTimeField(blank=True, verbose_name='u最后登录时间', auto_now=True) user_isValid = models.BooleanField(blank=True, default=False, verbose_name=u'用户有效性', help_text=u'是否是认证通过的用户') online = models.BooleanField(blank=True, default=False, verbose_name=u'用户登录状态') machine_code = models.CharField(blank=True, max_length=128, default='', verbose_name=u'机械码') language = models.CharField(blank=True, max_length=16, default='en', verbose_name=u'语言地区') # 手机注册增加字段 phone = models.CharField(max_length=16, verbose_name=u'手机号', default='', blank=True) objects = UserManager() USERNAME_FIELD = 'userID' # 必须有一个唯一标识 REQUIRED_FIELDS = ['is_superuser'] # 创建superuser时的必须字段 class Meta: ordering = ('-data_joined',) verbose_name = u'用户信息' db_table = 'device_user' get_latest_by = 'last_login' def __str__(self): return self.username def get_role_id(self): rids = [] roles = self.role.all() for role in roles: rids.append(role.rid) return rids def get_all_permission(self): roles = self.role.all() perms = self.permission.all() permslist = [] for role in roles: if role.rid == 100: perms = Permissions.objects.all() for perm in perms: permslist.append(perm.permName) return permslist for perm in perms: permslist.append(perm.permName) permSet = set(permslist) for role in roles: permlist_tmp = [] for perm in role.permission.all(): permlist_tmp.append(perm.permName) permSet_tmp = set(permlist_tmp) permSet = permSet.union(permSet_tmp) permslist = list(permSet) permslist.sort() return permslist @property def is_staff(self): return self.is_superuser # 设备表是建项目开发者设计的,自己看着办 class Device_Info(models.Model): id = models.CharField(blank=True, max_length=32, primary_key=True) userID = models.ForeignKey(Device_User, blank=True, to_field='userID', on_delete=models.CASCADE) NickName = models.CharField(blank=True, max_length=32, verbose_name=u'设备名称') UID = models.CharField(blank=True, max_length=32, verbose_name=u'设备UID', default='') SID = models.CharField(blank=True, max_length=32, verbose_name=u'服务器ID', default='') View_Account = models.CharField(blank=True, max_length=32, verbose_name=u'设备用户名称', default='') View_Password = models.CharField(blank=True, max_length=32, verbose_name=u'设备密码', default='') AudioFormat = models.IntegerField(blank=True, default=1, verbose_name=u'初始化影像') EventNotification = models.IntegerField(blank=True, verbose_name=u'报警类型', default=0) ChannelIndex = models.IntegerField(blank=True, verbose_name=u'通道号', default=0) Online = models.BooleanField(blank=True, default=False, verbose_name=u'设备是否在线') mMonitorIndex = models.IntegerField(blank=True, default=-1) Type = models.IntegerField(blank=True, verbose_name='设备类型') DebugMode = models.IntegerField(blank=True, verbose_name=u'调试模式', default=0) NotificationMode = models.IntegerField(blank=True, verbose_name=u'是否报警', default=0) qvgaLevel = models.BooleanField(blank=True, verbose_name=u'SD与HD画面', default=0, help_text=u'0代表:SD、1代表:HD') isShare = models.BooleanField(blank=True, verbose_name=u'共享设备', help_text=u'是否为共享获取的设备', default=False) primaryUserID = models.CharField(blank=True, verbose_name='主用户id', max_length=32, default='') primaryMaster = models.CharField(max_length=64, verbose_name=u'主用户名', default='') data_joined = models.DateTimeField(blank=True, verbose_name=u'设备添加时间', auto_now_add=True) update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True, null=True) ip = models.CharField(blank=True, max_length=20, default='', verbose_name=u'设备区域ip') area = models.CharField(blank=True, max_length=100, default='', verbose_name=u'设备区域area') # ios要求新增字段 version = models.CharField(blank=True, max_length=20, default='', verbose_name=u'版本号') SpaceUsable = models.CharField(blank=True, max_length=20, default='', verbose_name=u'可用空间') SpaceSum = models.CharField(blank=True, max_length=20, default='', verbose_name=u'总空间') WIFIName = models.CharField(blank=True, max_length=50, default='', verbose_name=u'无线名称') WIFIIP = models.CharField(blank=True, max_length=20, default='', verbose_name=u'无线ip') WIFIPwd = models.CharField(blank=True, max_length=50, default='', verbose_name=u'无线密码') isDetector = models.BooleanField(blank=True, verbose_name=u'侦测开关0:关闭,1:开启)', default=False) DetectorRank = models.IntegerField(blank=True, default=0, verbose_name=u'侦测灵敏度 1:低,2:中,3:高4:最高') iSNotification = models.BooleanField(blank=True, verbose_name=u'报警通知 0:关闭,1:开启)', default=False) MirrorType = models.IntegerField(blank=True, default=0, verbose_name=u'镜像类型 0:关闭镜像,1:上下镜像,2:左右镜像,3:上下左右镜像') RecordType = models.IntegerField(blank=True, default=0, verbose_name=u'录像模式(0:关闭,1:全是录像,3:报警录像)') TimeZone = models.CharField(blank=True, max_length=50, default='', verbose_name=u'时区') isVod = models.SmallIntegerField(blank=True, default=0, verbose_name='是否支持云存') # 是否支持云存设备 isExist = models.SmallIntegerField(blank=True, default=1, verbose_name='是否被删除') # 是否被删除了(需主用户交互) 1存在,0不存在 ### REQUIRED_FIELDS = [] def __str__(self): return self.NickName def model_to_dict(self, fields=None, exclude=None): opts = self._meta data = {} for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many): if not getattr(f, 'editable', False): continue if fields and f.name not in fields: continue if exclude and f.name in exclude: continue data[f.name] = f.value_from_object(self) return data class Meta: db_table = 'device_info' ordering = ('-data_joined',) verbose_name = u'用户设备信息表' verbose_name_plural = verbose_name class Access_Log(models.Model): id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID') user = models.CharField(max_length=100, default='', db_index=True, blank=True, verbose_name=u'用户') operation = models.CharField(max_length=100, db_index=True, default='', blank=True, verbose_name=u'操作') ip = models.CharField(max_length=100, default='', db_index=True, blank=True, verbose_name=u'访问ip地址') url = models.CharField(max_length=150, default='', blank=True, verbose_name=u'访问路径') status = models.IntegerField(default=0, blank=True, verbose_name=u'状态') time = models.DateTimeField(null=True, blank=True, db_index=True, verbose_name=u'访问时间') content = models.TextField(blank=True, default='', verbose_name=u'参数内容') class Meta: db_table = 'access_log' verbose_name = u'访问日志表' verbose_name_plural = verbose_name class Equipment_Stream(models.Model): id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID') userID = models.CharField(blank=True, max_length=32, verbose_name=u'用户ID') status = models.IntegerField(null=True, blank=True, verbose_name=u'状态') uid = models.CharField(null=True, blank=True, max_length=32, verbose_name=u'设备ID') channel = models.IntegerField(null=True, blank=True, verbose_name=u'设备通道') access_token = models.CharField(blank=True, max_length=128, verbose_name=u'设备推流验证令牌') total_flow = models.FloatField(null=True, blank=True, verbose_name=u'传输总容量') add_time = models.DateTimeField(blank=True, null=True, verbose_name=u'加入时间', auto_now_add=True) update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True) rank = models.IntegerField(null=True, blank=True, verbose_name=u'推流套餐类型') class Meta: db_table = 'equipment_stream' verbose_name = u'用户设备推流表' verbose_name_plural = verbose_name class Equipment_Sensor(models.Model): id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID') status = models.IntegerField(null=True, blank=True, verbose_name=u'状态') type = models.IntegerField(null=True, blank=True, verbose_name=u'类型') name = models.CharField(null=True, blank=True, max_length=128, verbose_name=u'传感器名称') add_time = models.DateTimeField(blank=True, null=True, verbose_name=u'加入时间', auto_now_add=True) update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True) uid = models.CharField(null=True, blank=True, max_length=32, verbose_name=u'设备ID') def __str__(self): return self.id class Meta: db_table = 'equipment_sensor' verbose_name = u'设备传感器表' verbose_name_plural = verbose_name ordering = ('id',) class Equipment_Info(models.Model): id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID') devUid = models.CharField(default='', blank=True, max_length=32, verbose_name=u'设备ID') devNickName = models.CharField(blank=True, max_length=32, default='', verbose_name=u'设备昵称') Channel = models.IntegerField(default=1, blank=True, verbose_name=u'设备通道') eventType = models.IntegerField(default=0, blank=True, verbose_name=u'事件类型') status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态') alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息') eventTime = models.CharField(blank=True, default='', max_length=16, verbose_name=u'设备报警时间') receiveTime = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间') userID = models.ForeignKey(Device_User, null=True, blank=True, to_field='userID', on_delete=models.CASCADE) is_st = models.SmallIntegerField(default=0, verbose_name='是否截图') # 0 否,1 是图,2,视频 def __str__(self): return self.id class Meta: db_table = 'equipment_info' verbose_name = u'设备信息推送表' verbose_name_plural = verbose_name ordering = ('-id',) class Feedback_Info(models.Model): id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID') userID = models.CharField(blank=True, max_length=32, verbose_name=u'用户ID') status = models.SmallIntegerField(default=0, verbose_name='状态:0未解决/解决') content = models.TextField(blank=True, null=True, verbose_name=u'反馈描述') addTime = models.DateTimeField(blank=True, null=True, verbose_name=u'加入时间/反馈时间', auto_now_add=True) updTime = models.DateTimeField(blank=True, null=True, verbose_name=u'更新时间', auto_now=True) urls = models.TextField( blank=True, max_length=300, default='', verbose_name=u'存储多张图片的路径') def __str__(self): return self.id class Meta: db_table = 'feedback_info' verbose_name = u'用户反馈信息表----暂时不用' verbose_name_plural = verbose_name ordering = ('id',) class User_Brand(models.Model): id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID') # 关联用户 userID = models.ForeignKey( Device_User,to_field='userID',on_delete=models.CASCADE) deviceSupplier = models.CharField(max_length=32, default='', verbose_name='(必填)设备供应商 string (例:华为、小米...)') deviceModel = models.CharField(max_length=32, default='', verbose_name='(必填)设备型号 string @mock=HM NOTE 1TD') osType = models.CharField(max_length=32, default='', verbose_name='(必填)操作系统名称 string @mock=Android') osVersion = models.CharField(max_length=32, default='', verbose_name='(必填)操作系统版本号 string @mock=4.0') ip = models.CharField(blank=True,max_length=20,default='',verbose_name=u'区域ip') addTime = models.IntegerField( verbose_name='添加时间', default=0) def __str__(self): return self.id class Meta: db_table = 'user_brand' verbose_name = u'用户登录手机端手机品牌统计表' verbose_name_plural = verbose_name ordering = ('id',) # 存储通表 class VodBucketModel(models.Model): id = models.AutoField(primary_key=True, verbose_name='主键') bucket = models.CharField(max_length=30, verbose_name='设备UID') storeDay = models.IntegerField(default=0, verbose_name='存储生命周期(天)') content = models.TextField(verbose_name='描述') endpoint = models.CharField(max_length=125, default='', verbose_name='存储节点') area = models.CharField(max_length=16, default='', verbose_name='区域') region = models.CharField(max_length=16, default='', verbose_name='regionID') addTime = models.IntegerField(verbose_name='添加时间', default=0) updTime = models.IntegerField(verbose_name='更新时间', default=0) def __str__(self): return self.id class Meta: db_table = 'vod_bucket' verbose_name = u'存储通信息' verbose_name_plural = verbose_name ordering = ('-id',) class Store_Meal(models.Model): id = models.AutoField(primary_key=True, verbose_name=u'自增ID') title = models.CharField(blank=True, max_length=32, verbose_name=u'标题') currency = models.CharField(blank=True, default='USD', max_length=32, verbose_name=u'货币') price = models.CharField(blank=True, max_length=32, verbose_name=u'价格') day = models.IntegerField(default=0, blank=True, verbose_name=u'套餐天数') content = models.TextField(blank=True, null=True, verbose_name=u'描述') add_time = models.DateTimeField(blank=True, null=True, verbose_name=u'加入时间', auto_now_add=True) type = models.SmallIntegerField(default=0, verbose_name='付款类型') # 0 是paypal,1为支付宝 update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True) bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE, default=1, verbose_name='存储空间') def __str__(self): return self.id class Meta: db_table = 'store_meal' verbose_name = u'存储套餐' verbose_name_plural = verbose_name ordering = ('id',) class Equipment_Version(models.Model): eid = models.CharField(blank=True, max_length=32, primary_key=True) ESN = models.CharField(blank=True, max_length=32, verbose_name=u'设备规格名称') code = models.CharField(blank=True, max_length=64, verbose_name=u'设备规格代码') version = models.CharField(blank=True, max_length=64, verbose_name=u'设备版本') softwareVersion = models.CharField(blank=True, max_length=32, verbose_name=u'软件版本') chipModelList2Code = models.CharField(max_length=32, blank=True, verbose_name=u'主芯片码') channel = models.IntegerField(blank=True, verbose_name=u'通道数') resolutionRatio = models.IntegerField(blank=True, verbose_name=u'分辨率') type = models.CharField(blank=True, max_length=16, verbose_name=u'设备机型') companyCode = models.CharField(blank=True, max_length=128, verbose_name=u'用户公司名称') data_joined = models.DateTimeField(blank=True, verbose_name=u'加入时间', auto_now_add=True) fileSize = models.IntegerField(blank=True, verbose_name=u'文件总大小') filePath = models.CharField(blank=True, max_length=256, verbose_name=u'升级文件路径') Description = models.TextField(blank=True, default='', verbose_name=u'描述信息') fileMd5 = models.CharField(blank=True, max_length=32, default='', verbose_name=u'上传文件MD5加密') status = models.BooleanField(blank=True, default=True, verbose_name=u'是否开启更新状态') update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True) lang = models.CharField(blank=True, default='en', max_length=32, verbose_name=u'ota包内置语言') mci = models.CharField(default='', blank=True, max_length=10, verbose_name='设备类型') def __str__(self): return self.eid class Meta: verbose_name = '设备版本信息' ordering = ('-data_joined',) db_table = 'equipment_version' class App_Info(models.Model): id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID') appBundleId = models.CharField(blank=True, max_length=32, verbose_name=u'appID') appName = models.CharField(blank=True, max_length=32, verbose_name=u'app名称') systemLanguage = models.CharField(blank=True, max_length=32, verbose_name=u'系统语言') newAppversion = models.CharField(blank=True, max_length=12, verbose_name=u'系统版本') minAppversion = models.CharField(default='', blank=True, max_length=12, verbose_name=u'最小系统版本') bundleVersion = models.CharField(blank=True, max_length=12, verbose_name=u'项目版本') content = models.TextField(blank=True, default='', verbose_name=u'更新内容') app_type = models.IntegerField(default=0, blank=True, verbose_name=u'app类型') # ios 1,android 2 add_time = models.DateTimeField(blank=True, null=True, verbose_name=u'加入时间', auto_now_add=True) update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True) downloadLink = models.TextField(blank=True, default='', verbose_name='升级') def __str__(self): return self.id class Meta: db_table = 'app_info' verbose_name = u'app信息表' verbose_name_plural = verbose_name ordering = ('id',) class App_Colophon(models.Model): id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID') app_id = models.ForeignKey(App_Info, to_field='id', on_delete=models.CASCADE, verbose_name='appid编号') lang = models.CharField(blank=True, max_length=32, verbose_name=u'系统语言') newApp_version = models.CharField(blank=True, max_length=12, verbose_name=u'系统版本') content = models.TextField(blank=True, default='', verbose_name=u'更新内容') version_time = models.IntegerField(default=0, blank=True, verbose_name=u'版本更新的时间') def __str__(self): return self.id class Meta: db_table = 'app_colophon' verbose_name = u'app信息表的记录关联到App_Info' verbose_name_plural = verbose_name ordering = ('id',) class Order_Model(models.Model): orderID = models.CharField(blank=True, max_length=20, primary_key=True, verbose_name=u'订单id') # 订单关联用户 userID = models.ForeignKey(Device_User, to_field='userID', on_delete=models.CASCADE) UID = models.CharField(max_length=20, verbose_name='设备UID') channel = models.SmallIntegerField(default=0, verbose_name=u'通道数') desc = models.CharField(max_length=50, default='', verbose_name='商品描述') price = models.CharField(default='', max_length=16, verbose_name='价格') currency = models.CharField(blank=True, default='USD', max_length=32, verbose_name=u'货币') addTime = models.IntegerField(verbose_name='添加时间', default=0) updTime = models.IntegerField(verbose_name='更新时间', default=0) endTime = models.IntegerField(verbose_name='结束时间', default=0) status = models.SmallIntegerField(default=0, verbose_name='付款状态') # 0:否,1:成功 # 订单关联套餐 rank = models.ForeignKey(Store_Meal, to_field='id', default='', on_delete=models.CASCADE, verbose_name='套餐类型') paypal = models.CharField(max_length=150, default='', verbose_name='paypal付款url') payType = models.SmallIntegerField(default=0, verbose_name='付款类型0:paypal,1:alipay') def __str__(self): return self.orderID class Meta: db_table = 'orders' verbose_name = u'app信息表' verbose_name_plural = verbose_name ordering = ('-orderID',) class VodHlsModel(models.Model): id = models.AutoField(primary_key=True, verbose_name='回放列表主键') uid = models.CharField(max_length=20, verbose_name='设备UID') channel = models.SmallIntegerField(default=0, verbose_name='通道') time = models.IntegerField(verbose_name='播放列表名字时间戳', default=0, db_index=True) endTime = models.IntegerField(verbose_name='删除时间', default=0) sec = models.IntegerField(verbose_name='秒数', default=0) bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE, default=1, verbose_name='存储空间') def __str__(self): return self.id class Meta: db_table = 'vod_hls' verbose_name = u'云存回放信息表' verbose_name_plural = verbose_name ordering = ('-id',) class OssCrdModel(models.Model): id = models.AutoField(primary_key=True, verbose_name='主键') uid = models.CharField(max_length=20, verbose_name='设备UID') channel = models.SmallIntegerField(default=0, verbose_name='通道') data = models.TextField(verbose_name='设备sts') addTime = models.IntegerField(verbose_name='添加时间', default=0) bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE, default=1, verbose_name='存储空间') def __str__(self): return self.id class Meta: db_table = 'osscrd' verbose_name = u'设备证书' verbose_name_plural = verbose_name ordering = ('-id',) class UID_Bucket(models.Model): id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID') uid = models.CharField(max_length=20, verbose_name='设备UID') channel = models.SmallIntegerField(default=0, verbose_name='通道') bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE, verbose_name='存储空间') status = models.SmallIntegerField(default=0, verbose_name='状态[0:开启,1:关闭]') endTime = models.IntegerField(verbose_name='结束时间', default=0) class Meta: db_table = 'vod_uid_bucket' verbose_name = u'设备关联套餐表' verbose_name_plural = verbose_name ordering = ('id',) # 推送uid绑定 app —— token_id class UID_App(models.Model): id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID') userID = models.ForeignKey(Device_User, to_field='userID', on_delete=models.CASCADE) uid = models.CharField(max_length=20, verbose_name='设备UID') appBundleId = models.CharField(blank=True, max_length=32, verbose_name=u'appID') app_type = models.IntegerField(default=0, verbose_name=u'app类型 1:ios,2:安卓') push_type = models.IntegerField(default=0, verbose_name=u'推送类型') # 0,apns 1,安卓gcm 2,极光 token_val = models.CharField(default='', max_length=160, verbose_name=u'设备验证令牌') status = models.SmallIntegerField(default=0, verbose_name='状态[0:关闭,1:开启,2:用户解绑]') m_code = models.CharField(default='', max_length=64, verbose_name='手机唯一标识') interval = models.IntegerField(verbose_name='推送间隔', default=0) # 秒 addTime = models.IntegerField(verbose_name='添加时间', default=0) updTime = models.IntegerField(verbose_name='更新时间', default=0) class Meta: db_table = 'uid_app' verbose_name = u'设备关联APP表' verbose_name_plural = verbose_name ordering = ('id',)