django模型层model

1、用户类

没有继承django自带的User类
头像使用了StdImageField,可自动生成缩略图
重写save方法进行密码加密
模型中省略了部分字段

from stdimage.models import StdImageField
from hashlib import sha1

class UserInfo(models.Model):
    SEX_CHOICES = (
        ('0', '女'),
        ('1', '男'),
        ('-1', '保密')
    )
    # xadmin后台使用form表单的功能,字段默认blank=False
    # 可以不填的字段需要加blank=True,blank是django层面的限制,跟数据库无关
    username = models.CharField(max_length=128, verbose_name='用户名', unique=True)
    password = models.CharField(max_length=128, verbose_name="密码")
    nickname= models.CharField(max_length=128, verbose_name='昵称', blank=True)
    # 访问原图:object.avatar.url,访问缩略图:object.avatar.thumbnail.url
    avatar = StdImageField(
        max_length=128,
        upload_to='user/%Y/%m',
        verbose_name="用户头像",
        variations={'thumbnail': {'width': 100, 'height': 100}},  # 设置生成缩略图自适应的像素尺寸
        default='user/default.png',
        blank=True
    )
    # choise 后台显示一个下拉菜单
    sex = models.CharField(verbose_name='性别', choices=SEX_CHOICES, default='-1', max_length=16)
    date_joined = models.DateTimeField(verbose_name="注册时间", auto_now_add=True, editable=False)
    # 对数据库的约束null默认未false
    last_login = models.DateTimeField(verbose_name="最近登陆", blank=True, null=True)
    is_active = models.BooleanField(verbose_name='有效', default=True)

    class Meta:
        verbose_name = "用户信息表"
        verbose_name_plural = verbose_name
        # ordering = ['sales_volume']
        # db_table = 'UserInfo'

    # 重写save方法,对密码进行加密
    def save(self, *args, **kwargs):
        if self.password:
            s1 = sha1()
            s1.update(self.password.encode())
            self.password = s1.hexdigest()
        super().save(*args, **kwargs)

    def __str__(self):
        return self.username

2.文件,图片上传处理

商品信息的模型
定义了对上传文件重命名的方法
模型类中自定义方法,可在xadmin后台中直接显示使用
模型中定义类方法,可直接使用类名调用
外键,DecimalField

from stdimage.models import StdImageField

# 处理上传图片名的函数
def handle_upload_name(instance, filename):
	# 通过判断父类进行路径赋值
    if isinstance(instance, GoodsType):
        base_path = 'goods/type'
    else:
        base_path = 'goods'
    ext = filename.split('.')[-1]
    new_filename = "%s.%s" % (uuid.uuid1(), ext)
    path = os.path.join(base_path, '%Y', '%m', new_filename)
    return time.strftime(path)


class GoodsInfo(models.Model):
    name = models.CharField(max_length=128, verbose_name='商品名称')
    image = StdImageField(
        max_length=128,
        upload_to=handle_upload_name,
        verbose_name="商品图片",
        variations={'thumbnail': {'width': 100, 'height': 75}},  # 设置生成缩略图自适应的像素尺寸
    )
    introduce = models.CharField(max_length=258, verbose_name="商品简介")
    price = models.DecimalField(verbose_name='单价', decimal_places=2, max_digits=7, null=False)
    # help_text
    unit = models.CharField(max_length=128, verbose_name="单位", null=False, help_text="500g、1只或者1箱等等")
    sales_volume = models.IntegerField(default=0, verbose_name='销量', editable=False)
    goods_type = models.ForeignKey(GoodsType, verbose_name="商品类别", on_delete=models.CASCADE)
    # 手动设置是否为推荐产品
    is_recommend = models.BooleanField(default=False, verbose_name='人气力荐')
    stock = models.IntegerField(verbose_name='库存数量')
    is_on_sale = models.BooleanField(verbose_name='在售', default=True)

	# 自定义属性,可以在注册后台的时候使用,也可以写在后台里
    def image_img(self):
        return '<a href="%s" target="_blank"><img src="%s" /></a>' % (self.image.url, self.image.thumbnail.url)

    image_img.short_description = '图片'
    image_img.allow_tags = True    # 加了这个后台才会渲染返回的html标签,否则当字符串处理

    @classmethod
    def get_recommend_goods(cls):
        return cls.objects.filter(is_recommend=True, is_on_sale=True)

3.模型中定义3种类方法

https://blog.csdn.net/weixin_43667990/article/details/90815572

StdImageField用法参考:https://www.cnblogs.com/yoyoketang/p/10655601.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值