class SPU(db_utils.BaseModel): """商品SPU""" name = models.CharField(max_length=50, verbose_name='名称') brand = db_utils.ForeignKey(Brand, on_delete=models.PROTECT, verbose_name='品牌') category1 = db_utils.ForeignKey(GoodsCategory, on_delete=models.PROTECT, related_name='cat1_spu', verbose_name='一级类别') category2 = db_utils.ForeignKey(GoodsCategory, on_delete=models.PROTECT, related_name='cat2_spu', verbose_name='二级类别') category3 = db_utils.ForeignKey(GoodsCategory, on_delete=models.PROTECT, related_name='cat3_spu', verbose_name='三级类别') sales = models.IntegerField(default=0, verbose_name='销量') comments = models.IntegerField(default=0, verbose_name='评价数') desc_detail = models.TextField(default='', verbose_name='详细介绍') desc_pack = models.TextField(default='', verbose_name='包装信息') desc_service = models.TextField(default='', verbose_name='售后服务') class Meta: db_table = 'md_spu' verbose_name_plural = verbose_name = '商品SPU' def __str__(self): return self.name
class SKU(db_utils.BaseModel): """商品SKU""" name = models.CharField(max_length=50, verbose_name='名称') caption = models.CharField(max_length=100, verbose_name='副标题') spu = db_utils.ForeignKey(SPU, on_delete=models.CASCADE, verbose_name='商品') category = db_utils.ForeignKey(GoodsCategory, on_delete=models.PROTECT, verbose_name='从属类别') price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='单价') cost_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='进价') market_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='市场价') stock = models.IntegerField(default=0, verbose_name='库存') sales = models.IntegerField(default=0, verbose_name='销量') comments = models.IntegerField(default=0, verbose_name='评价数') is_launched = models.BooleanField(default=True, verbose_name='是否上架销售') default_image = models.ImageField(max_length=200, default='', null=True, blank=True, verbose_name='默认图片') class Meta: db_table = 'md_sku' verbose_name_plural = verbose_name = '商品SKU' def __str__(self): return '%s: %s' % (self.id, self.name)
class GoodsChannel(db_utils.BaseModel): """商品频道""" group = db_utils.ForeignKey(GoodsChannelGroup, verbose_name='频道组名') category = db_utils.ForeignKey(GoodsCategory, on_delete=models.CASCADE, verbose_name='顶级商品类别') url = models.CharField(max_length=50, verbose_name='频道页面链接') sequence = models.IntegerField(verbose_name='组内顺序') class Meta: db_table = 'md_goods_channel' verbose_name_plural = verbose_name = '商品频道' def __str__(self): return self.category.name
class OAuthQQUser(db_utils.BaseModel): user = db_utils.ForeignKey('users.User', on_delete=models.CASCADE, verbose_name='用户') openid = models.CharField('openid', max_length=64, db_index=True) class Meta: db_table = 'md_oauth_qq' verbose_name_plural = verbose_name = 'QQ第三方登录'
class SKUSpecification(db_utils.BaseModel): """SKU具体规格""" sku = db_utils.ForeignKey(SKU, related_name='specs', on_delete=models.CASCADE, verbose_name='sku') spec = db_utils.ForeignKey(SPUSpecification, on_delete=models.PROTECT, verbose_name='规格名称') option = db_utils.ForeignKey(SpecificationOption, on_delete=models.PROTECT, verbose_name='规格值') class Meta: db_table = 'md_sku_specification' verbose_name_plural = verbose_name = 'SKU规格' def __str__(self): return '%s: %s - %s' % (self.sku, self.spec.name, self.option.value)
class Area(db_utils.BaseModel): name = models.CharField('名称', max_length=20) parent = db_utils.ForeignKey( 'self', on_delete=models.SET_NULL, related_name='subs', null=True, blank=True, verbose_name='上级行政区划') def __str__(self): return self.name class Meta: db_table = 'md_areas' verbose_name = verbose_name_plural = '省市区'
class GoodsVisitCount(db_utils.BaseModel): """统计分类商品访问量模型类""" category = db_utils.ForeignKey(GoodsCategory, on_delete=models.CASCADE, verbose_name='商品分类') count = models.IntegerField(verbose_name='访问量', default=0) date = models.DateField(auto_now_add=True, verbose_name='统计日期') class Meta: db_table = 'md_goods_visit' verbose_name = '统计分类商品访问量' verbose_name_plural = verbose_name
class SKUImage(db_utils.BaseModel): """SKU图片""" sku = db_utils.ForeignKey(SKU, on_delete=models.CASCADE, verbose_name='sku') image = models.ImageField(verbose_name='图片') class Meta: db_table = 'md_sku_image' verbose_name_plural = verbose_name = 'SKU图片' def __str__(self): return '%s %s' % (self.sku.name, self.id)
class Address(db_utils.BaseModel): """用户地址""" user = db_utils.ForeignKey(User, on_delete=models.CASCADE, related_name='addresses', verbose_name='用户') title = models.CharField(max_length=20, verbose_name='地址名称') receiver = models.CharField(max_length=20, verbose_name='收货人') province = db_utils.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='province_addresses', verbose_name='省') city = db_utils.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='city_addresses', verbose_name='市') district = db_utils.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='district_addresses', verbose_name='区') place = models.CharField(max_length=50, verbose_name='地址') mobile = models.CharField(max_length=11, verbose_name='手机') tel = models.CharField(max_length=20, null=True, blank=True, default='', verbose_name='固定电话') email = models.CharField(max_length=30, null=True, blank=True, default='', verbose_name='电子邮箱') is_deleted = models.BooleanField(default=False, verbose_name='逻辑删除') class Meta: db_table = 'md_address' verbose_name_plural = verbose_name = '用户地址' ordering = ['-update_time']
class SpecificationOption(db_utils.BaseModel): """规格选项""" spec = db_utils.ForeignKey(SPUSpecification, related_name='options', on_delete=models.CASCADE, verbose_name='规格') value = models.CharField(max_length=20, verbose_name='选项值') class Meta: db_table = 'md_specification_option' verbose_name_plural = verbose_name = '规格选项' def __str__(self): return '%s - %s' % (self.spec, self.value)
class SPUSpecification(db_utils.BaseModel): """商品SPU规格""" spu = db_utils.ForeignKey(SPU, on_delete=models.CASCADE, related_name='specs', verbose_name='商品SPU') name = models.CharField(max_length=20, verbose_name='规格名称') class Meta: db_table = 'md_spu_specification' verbose_name_plural = verbose_name = '商品SPU规格' def __str__(self): return '%s: %s' % (self.spu.name, self.name)
class Content(db_utils.BaseModel): """广告内容""" category = db_utils.ForeignKey(ContentCategory, on_delete=models.PROTECT, verbose_name='类别') title = models.CharField(max_length=100, verbose_name='标题') url = models.CharField(max_length=300, verbose_name='内容链接') image = models.ImageField(null=True, blank=True, verbose_name='图片') text = models.TextField(null=True, blank=True, verbose_name='内容') sequence = models.IntegerField(verbose_name='排序') status = models.BooleanField(default=True, verbose_name='是否展示') class Meta: db_table = 'md_content' verbose_name_plural = verbose_name = '广告内容' def __str__(self): return self.category.name + ': ' + self.title
class GoodsCategory(db_utils.BaseModel): """商品类别""" name = models.CharField(max_length=10, verbose_name='名称') parent = db_utils.ForeignKey('self', related_name='subs', null=True, blank=True, on_delete=models.CASCADE, verbose_name='父类别') class Meta: db_table = 'md_goods_category' verbose_name_plural = verbose_name = '商品类别' def __str__(self): return self.name
class User(AbstractUser): mobile = models.CharField('手机号', max_length=11, unique=True) email_active = models.BooleanField('邮箱状态', default=False) default_address = db_utils.ForeignKey('Address', related_name='users', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='默认地址') create_time = models.DateTimeField('创建时间', auto_now_add=True, db_index=True, editable=False) update_time = models.DateTimeField('修改时间', auto_now=True, db_index=True, editable=False) class Meta: db_table = 'md_users' verbose_name_plural = verbose_name = '用户表'