model设计

归类设计model、app

  • 通过类型区分model,放置到不同app的model块
  • 例如如果是商城类型的网站设计:
    • 商品 goods
    • 交易 trade
    • 用户 users
    • 用户操作 userOperation

常用基础model知识

基础Field

  • CharField
  • DateField
  • DateTimeField
    • 关键参数:auto_now_add=True(在新增时创建时间之后不再变)和auto_now=True即mysql中的CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP
  • BigIntegerField
  • BinaryField
  • DecimalField
    • 关键参数:max_digits小数总长度/decimal_places(小数位长度)
  • EmailField Admin和modelForm提供验证email的正则
  • FileField
    • 关键参数:upload_to=”path”上传文件保存路径,存储时以路径存到数据库
  • FloatField
  • IntegerField
  • URLField Admin和modelForm中提供url验证
  • IPAddressField Admin和modelForm中提供ipv4
  • GenericIPAddressField Admin和modelForm中提供ipv4和ipv6的验证
  • ImageField
    • 关键参数:upload_to=”path”
  • 常用参数
    • null
    • unique
    • db_index
    • default

关系Field

  • ForeignKey

    • to
      • “self”表示自关联
    • to_field
    • related_name
      • 反向操作需要使用的字段名,用于代替默认的反向查询表名_set
    • on_delete 当主表删除数据时,关联表所做行为
      • CASECADE 串级删除
      • DO_NOTHING 报IntegrityError
      • PROTECT 报ProtectedError
      • SET_NULL
      • SET_DEFAULT
      • SET(val)
    • db_constraint
  • ManytoManyField 与ForeinKey类似

model原信息meta

  • db_table 名字
  • index_together 联合索引
  • unique_together 联合唯一索引
  • ordering 指定默认按什么字段排序

第三方Field

pip install djangoUeditor(或github克隆)

  • UEditorField(verbose_name=’’, imagePath=’’, filePath=’’, width=1000, height=300)
    • 富文本编辑字段即可发图片、文本、文件。

模型继承

抽象基类

  • 和python类继承类似,将子类的共同数据抽象出来继承充用,不会创建实际的数据表
    • 如django.contrib.auth.models中的AbstractUser

多表继承

  • 父类和子类都是独立自主、功能完整、可正常使用的模型,都有自己的数据表,但内部隐藏一个一对一关系

代理模型

  • 在meta中声明proxy=True可以代理继承中的模型

多重继承

用户模型

引用用户模型

  • 由于app添加了django.contrib.auth默认了自带的user,如果不自定义并在setting中修改,即会使用默认的user作为用户
  • 自定义user须在setting中添加配置AUTH_USER_MODEL=’APP.XXXMODEL’,并继承AbstractUser
  • 如果有别的model外键user,需要通过get_user_model()寻找user,即setting.AUTH_USER_MODEL
  • 在migration时请确保user放在首位,解决Django的动态依赖

用户模型关键参数

USERNAME_FIELD

  • 必须设置,且改field必须含有unique=True即USERNAME_FIELD = ‘字段名’

    2.4.2.2 REQUIRED_FIELDS

  • 设置list,如果设置,该字段为必填字段(主要用于createsuperuser时使用),REQUIRED_FIELDS = [‘date_of_birth’, ‘height’],还有一些方法可以继承原抽象user模型

自定义user管理器

  • 大概是重写一下UserManager的几个方法如create_user/create_super_user

自定义用户和权限

  • 用户权限一般包括增删改查某个model,权限名一般有app名(app_label),权限动作和模型名组成

分配权限与查看权限

  • 查看权限
    • user.has_perm(‘appname.operation_modelname’)
    • user.get_group_permissions()
    • user.get_all_permissions()
  • 分配权限
    • user.user_permissions = [permission1, permission2……]
    • user.user_permissions.add(per1, per2)
    • user.user_permissions.remove(per1, per2)
    • user.uer_permissions.clear()
  • 自定义权限
    • 方法一:在model的meta中设置权限permissions=((“read_xxx”, “Can Read xxxx”),())
    • 方法二:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      from blog.models import Article
      from django.contrib.auth.models import Permission
      from django.contrib.contenttypes.models import ContentType

      content_type = ContentType.objects.get_for_model(article)
      permission1 = Permission.objects.create(
      codename='publish_article',
      name='Can publish articles',
      content_type=content_type,
      )

      permission2 = Permission.objects.create(
      codename='comment_article',
      name='Can comment articles',
      content_type=content_type,
      )
  • 把用户添加到组
    • 获取用户对象和组对象,因为是多对多关系,直接user.groups.add(g)即可
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      # 创建一个分组
      Group.objects.create(name='reader')

      # 获取某用户
      u = User.objects.get(username='test_user')

      # 获取某分组
      g = Group.objects.get(name='reader')

      # 把用户加入到分组中
      u.groups.add(g)

      # 获取某个权限
      p= Permission.objects.get(codename='read_book')

      # 把该权限加入到分组
      g.permissions.add(p)
      Group 还有其他操作:

      # 把用户加入分组,group_list可以是一个或多个分组
      u.groups = [group_list]

      # 把用户加入某分组
      u.groups.add(group, group, ...)

      # 把某用户从某分组删除
      u.groups.remove(group, group, ...)

      # 该用户退出所以分组
      u.groups.clear()

      # 把权限加入到该分组
      g.permissions.add(permission, permissions, ...)
      g.permissions.remove(permission, permissions, ...)
      g.permissions.clear()
  • 视图权限控制
    • 1.直接通过user.has_perm(‘’)判断
    • 2.通过装饰器判断:permission_required(perm, login_url=None, raise_exception=False)

      2.5 admin注册

  • 如果要使用自带的后台管理系统即需要注册各个model的admin,这里可以使用simpleui
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    class GoodsAdmin(ImportExportActionModelAdmin, ImportExportModelAdmin):
    resource_class = GoodsResource
    list_filter = ["name", "click_num", "sold_num", "fav_num", "goods_num", "market_price",
    "shop_price", "is_new", "is_hot", "add_time", "category__name"]
    list_display = ["name", "click_num", "sold_num", "fav_num", "goods_num", "market_price",
    "shop_price", "goods_brief", "goods_desc", "is_new", "is_hot", "add_time"]
    search_fields = ['name', ]
    list_editable = ["is_hot", ]
    # fieldsets = [
    # (None, {'fields': ['name']}, ),
    # (None, {'fields': ['goods_desc'], 'classes': ['collapse']}),
    # ]
    style_fields = {"goods_desc": "ueditor"}

    class GoodsImagesInline(admin.StackedInline):
    model = GoodsImage
    exclude = ["add_time"]
    extra = 1
    style = 'tab'

    inlines = [GoodsImagesInline, ]
    admin.site.register(Goods, GoodsAdmin)

2.6 单独使用model

  • 使用django的model进行测试,数据添加等操作时,需要:
    • 1.获取当前路径,把当前路径加入sys
    • 2.设置django setting为当前环境变量(os)
    • 3.导入django并启动
    • 4.导入app模型使用
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      import sys
      import os
      import django
      pwd = os.path.dirname(os.path.realpath(__file__))
      sys.path.append(pwd+"../")
      os.environ.setdefault("DJANGO_SETTINGS_MODULE", "MxShop.settings")
      django.setup()

      from goods.models import GoodsCategory, Goods
      from db_tools.data.category_data import row_data
      from django.db.models import Count, Max

      a = Goods.objects.all().values('category').annotate(a=Max('market_price'))
      b = Goods.objects.all().aggregate(a=Max('market_price'))

分享到