利用django框架,快速搭建管理后台

若业务逻辑是频繁操作数据库的增删改查,无其他特别复杂逻辑,那么,django admin后台会是一个不错的选择。

这里推荐官方文档,是最明智的选择,且已翻译好了一部分,你想知道关于django的一切,都在这里:https://docs.djangoproject.com/zh-hans/2.1/contents/

下面大概总结一下此项目的操作过程:

难点:

a.如何根据现有数据库,快速生成models,并让django接管?

b.为方便处理,数据库中外键关联可以添加上

c.数据库中有一张表存储的时间格式是时间戳,django admin站点如何新增数据时,弹出时间选择工具?

1.该项目为上线项目,也就是说,数据库已经存在,表结构已经设计好了,不方便修改,django框架比较适合从零开始搭建项目,那怎么办呢?

2.利用django自带工具inspectdb根据现有数据库快速生成models:python manage.py inspectdb > models.py

3.models有了,接下来便创建应用

4.应用创建完毕后,无须编写路由视图,直接编写应用下admin.py文件

5.应用models.py和admin.py是核心需处理文件,以下是该2个文件的代码:

models.py

# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:
#   * Rearrange models' order
#   * Make sure each model has one field with primary_key=True
#   * Make sure each ForeignKey has `on_delete` set to the desired behavior.
#   * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
# Feel free to rename the models, but don't rename db_table values or field names.
import time

from django.db import models


class BaseModel(models.Model):
    """模型类基类"""
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='添加时间')
    updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')

    class Meta:
        abstract = True


class User(BaseModel):
    """用户表"""
    id = models.BigAutoField(primary_key=True)
    name = models.CharField(max_length=255, verbose_name='用户名')
    pwd = models.CharField(max_length=255, verbose_name='密码')
    content_user = models.CharField(max_length=255)
    content_phone = models.CharField(max_length=255)
    content_mail = models.CharField(max_length=255)
    content_address = models.CharField(max_length=255)
    type = models.IntegerField(choices=[(0, '广告主'), (1, '流量主'), (2, '管理员')], verbose_name='type:0 广告主,1 流量主,2 管理员')
    uid = models.ForeignKey('self', on_delete=models.DO_NOTHING, db_column='uid', verbose_name='操作者')
    session_key = models.CharField(max_length=64, blank=True, null=True)
    session_key2 = models.CharField(max_length=64, blank=True, null=True)
    session_expire_date = models.DateTimeField(blank=True, null=True, verbose_name='session过期日期')

    class Meta:
        db_table = 'user'
        verbose_name = '用户'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class AdMaterial(BaseModel):
    """广告素材表"""
    id = models.BigAutoField(primary_key=True)
    show_url = models.CharField(max_length=255, verbose_name='图片,视频广告的url')
    show_content = models.CharField(max_length=255, verbose_name='文字广告内容')
    show_report_url = models.CharField(max_length=255, verbose_name='展示上报url')
    click_url = models.CharField(max_length=255, verbose_name='点击跳转url')
    click_report_url = models.CharField(max_length=255, verbose_name='点击上报url')
    type = models.IntegerField(choices=[(0, '图片'), (1, '文字'), (2, '视频')], verbose_name='type:0 图片,1 文字,2 视频')
    uid_belong = models.ForeignKey('User', on_delete=models.DO_NOTHING, related_name='ad_material_uid_belong',
                                   db_column='uid_belong', verbose_name='归属者')
    uid = models.ForeignKey('User', on_delete=models.DO_NOTHING, related_name='ad_material_uid', db_column='uid',
                            verbose_name='操作者')

    class Meta:
        db_table = 'ad_material'
        verbose_name = '广告素材'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.show_content


class AdPostion(BaseModel):
    """广告位表"""
    id = models.BigAutoField(primary_key=True)
    title = models.CharField(max_length=255, verbose_name='广告位名称')
    ad_width = models.CharField(max_length=255, verbose_name='广告位宽')
    ad_height = models.CharField(max_length=255, verbose_name='广告位高')
    ad_type = models.CharField(choices=[('0', '图片'), ('1', '文字'), ('2', '视频')], max_length=255,
                               verbose_name='ad_type:0 图片,1 文字,2 视频')
    support_video = models.IntegerField(choices=[(0, '不支持'), (1, '支持')], verbose_name='support_video:0 不支持,1 支持')
    app = models.ForeignKey('AppInfo', on_delete=models.DO_NOTHING, verbose_name='app id')
    app_name = models.CharField(max_length=255, verbose_name='app name')
    status = models.BigIntegerField()
    uid = models.ForeignKey('User', on_delete=models.DO_NOTHING, db_column='uid', verbose_name='操作者')

    class Meta:
        db_table = 'ad_postion'
        verbose_name = '广告位'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.title


class Advertisement(BaseModel):
    """投放情况汇总表"""
    id = models.BigAutoField(primary_key=True)
    schedules_id = models.BigIntegerField()
    get_count = models.BigIntegerField()
    show_count = models.BigIntegerField()
    click_count = models.BigIntegerField()
    uv = models.BigIntegerField()
    pv = models.BigIntegerField()
    date_time = models.CharField(max_length=255, verbose_name='日期')

    class Meta:
        db_table = 'advertisement'
        verbose_name = '投放情况汇总'
        verbose_name_plural = verbose_name


class AppInfo(BaseModel):
    """App信息表"""
    id = models.BigAutoField(primary_key=True)
    app_name = models.CharField(max_length=255, verbose_name='app 名称')
    app_secret = models.CharField(max_length=255, verbose_name='app 密钥')
    app_package = models.CharField(max_length=255, verbose_name='app 包名')
    app_version = models.CharField(max_length=255, verbose_name='app 版本')
    app_desc = models.CharField(max_length=255, verbose_name='app 描述')
    uid_belong = models.ForeignKey('User', on_delete=models.DO_NOTHING, related_name='app_info_uid_belong',
                                   db_column='uid_belong', verbose_name='归属者')
    uid = models.ForeignKey('User', on_delete=models.DO_NOTHING, related_name='app_info_uid', db_column='uid',
                            verbose_name='操作者')
    type = models.IntegerField(choices=[(0, 'ios'), (1, 'android'), (2, 'web'), (3, '小程序')],
                               verbose_name='type:0 ios,1 android,2 web,3 小程序')

    class Meta:
        db_table = 'app_info'
        verbose_name = 'App信息'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.app_name


class DevicedInfo(BaseModel):
    """设备信息表"""
    id = models.BigAutoField(primary_key=True)
    did_uuid = models.CharField(max_length=255)
    imei = models.CharField(max_length=255)
    imsi = models.CharField(max_length=255)
    openudid = models.CharField(max_length=255)
    ssid = models.CharField(max_length=255)
    wifi_mac = models.CharField(max_length=255)
    phone_name = models.CharField(max_length=255)
    os = models.CharField(max_length=255, verbose_name='操作系统')
    os_version = models.CharField(max_length=255, verbose_name='操作系统版本')
    vendor = models.CharField(max_length=255, verbose_name='品牌')
    model = models.CharField(max_length=255, verbose_name='型号')
    language = models.CharField(max_length=255, verbose_name='语言')

    class Meta:
        db_table = 'deviced_info'
        verbose_name = '设备信息'
        verbose_name_plural = verbose_name


class Region(BaseModel):
    """位置信息表"""
    id = models.BigAutoField(primary_key=True)
    latitude = models.CharField(max_length=255, blank=True, null=True, verbose_name='纬度')
    longitude = models.CharField(max_length=255, blank=True, null=True, verbose_name='经度')
    country = models.CharField(max_length=255, verbose_name='国家')
    province = models.CharField(max_length=255, verbose_name='省份')
    city = models.CharField(max_length=255, verbose_name='城市')
    district = models.CharField(max_length=255, blank=True, null=True, verbose_name='区域')

    class Meta:
        db_table = 'region'
        verbose_name = '位置信息'
        verbose_name_plural = verbose_name


class Schedules(BaseModel):
    """广告排期表"""
    id = models.BigAutoField(primary_key=True)
    ad_third_res = models.IntegerField(blank=True, null=True,
                                       verbose_name='第三方广告公司的资源,这个与ad_material_id护持使用,这个值以AdThridRes按位与 保存')
    begin_time = models.BigIntegerField(verbose_name='开始时间(时间戳10位)')
    end_time = models.BigIntegerField(verbose_name='结束时间(时间戳10位)')
    state = models.IntegerField(choices=[(0, '无效'), (1, '执行')], verbose_name='state:排期状态 0 无效,1 执行')
    type = models.IntegerField(verbose_name='类型')
    region_id = models.BigIntegerField(verbose_name='区域限制id')
    freq = models.IntegerField(verbose_name='频次限制')
    uniform = models.IntegerField(choices=[(0, '匀速'), (1, '不限制')], verbose_name='uniform:0 匀速,1 不限制')
    ad_postion = models.ForeignKey(AdPostion, on_delete=models.DO_NOTHING, verbose_name='广告位')
    ad_material = models.ForeignKey(AdMaterial, on_delete=models.DO_NOTHING, blank=True, null=True,
                                    verbose_name='广告素材')
    uid = models.ForeignKey('User', on_delete=models.DO_NOTHING, db_column='uid', verbose_name='操作者')
    # 以下新增字段
    begin_time2 = models.DateTimeField(verbose_name='开始时间')
    end_time2 = models.DateTimeField(verbose_name='结束时间')

    class Meta:
        db_table = 'schedules'
        verbose_name = '广告排期'
        verbose_name_plural = verbose_name

    # 列可以是模型字段,还可以是模型方法,要求方法有返回值
    def begin_time_method(self):
        """begin_time"""
        timeArray = time.localtime(self.begin_time)
        otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
        return otherStyleTime

    def end_time_method(self):
        """end_time"""
        timeArray = time.localtime(self.end_time)
        otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
        return otherStyleTime

    begin_time_method.short_description = '开始时间'  # 设置方法字段在admin中显示的标题
    end_time_method.short_description = '结束时间'  # 设置方法字段在admin中显示的标题
    # 让自定义的方法名也能实现排序
    begin_time_method.admin_order_field = 'begin_time'
    end_time_method.admin_order_field = 'end_time'

    def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
        """每次创建对象或修改对象都会执行此方法"""
        # 1.将时间对象转换成str格式
        begin_time2_str = str(self.begin_time2)
        end_time2_str = str(self.end_time2)
        # 2.将时间str转换为时间数组
        begin_time2_time_array = time.strptime(begin_time2_str, "%Y-%m-%d %H:%M:%S")
        end_time2_time_array = time.strptime(end_time2_str, "%Y-%m-%d %H:%M:%S")
        # 转换为时间戳
        begin_time2_time_stamp = int(time.mktime(begin_time2_time_array))
        end_time2_time_stamp = int(time.mktime(end_time2_time_array))
        self.begin_time = begin_time2_time_stamp
        self.end_time = end_time2_time_stamp
        super().save(force_insert, force_update, using, update_fields)


class UploadFile(BaseModel):
    """上传文件表"""
    id = models.BigAutoField(primary_key=True)
    name = models.CharField(max_length=255, verbose_name='文件名')
    file_id = models.CharField(max_length=255, verbose_name='file_url')
    url = models.CharField(max_length=255)
    uid_belong = models.BigIntegerField(verbose_name='归属者id')
    uid = models.BigIntegerField(verbose_name='操作者id')

    class Meta:
        db_table = 'upload_file'
        verbose_name = '上传文件'
        verbose_name_plural = verbose_name

admin.py

from django.contrib import admin
from .models import AdMaterial
from .models import AdPostion
from .models import Advertisement
from .models import AppInfo
from .models import DevicedInfo
from .models import Region
from .models import Schedules
from .models import UploadFile
from .models import User

admin.site.index_title = '欢迎使用advert_api管理系统'
admin.site.site_title = 'advert_api_cms'
admin.site.site_header = 'advert_api管理系统'


@admin.register(AdMaterial)
class AdMaterialAdmin(admin.ModelAdmin):
    """素材管理类"""
    list_per_page = 15  # 每页显示多少条数据
    list_display = ['id', 'show_url', 'show_content', 'show_report_url', 'click_url', 'click_report_url',
                    'type', 'uid_belong', 'uid', 'created_at', 'updated_at']  # 展示字段
    ordering = ['id']  # ordering设置默认排序字段,负号表示降序排序
    list_filter = ['type']  # 过滤器
    search_fields = ['id', 'uid_belong', 'uid', 'show_content', 'type']  # 搜索
    list_display_links = ['id', 'show_url', 'show_content', 'show_report_url', 'click_url', 'click_report_url',
                          'type', 'uid_belong', 'uid', 'created_at', 'updated_at']  # 设置哪些字段可以点击进入编辑界面


@admin.register(AdPostion)
class AdPostionAdmin(admin.ModelAdmin):
    """广告位管理类"""
    list_per_page = 15  # 每页显示多少条数据
    list_display = ['id', 'title', 'ad_width', 'ad_height', 'ad_type', 'support_video',
                    'app', 'app_name', 'status', 'uid', 'created_at', 'updated_at']  # 展示字段
    ordering = ['id']  # ordering设置默认排序字段,负号表示降序排序
    list_filter = ['ad_type', 'support_video', 'status']  # 过滤器
    search_fields = ['id', 'uid', 'title', 'app_name']  # 搜索
    list_display_links = ['id', 'title', 'ad_width', 'ad_height', 'ad_type', 'support_video',
                          'app', 'app_name', 'status', 'uid', 'created_at', 'updated_at']  # 设置哪些字段可以点击进入编辑界面


@admin.register(Advertisement)
class AdvertisementAdmin(admin.ModelAdmin):
    """投放情况汇总管理类"""
    list_per_page = 15  # 每页显示多少条数据
    list_display = ['id', 'schedules_id', 'get_count', 'show_count', 'click_count', 'uv',
                    'pv', 'date_time', 'created_at', 'updated_at']  # 展示字段
    ordering = ['id']  # ordering设置默认排序字段,负号表示降序排序
    # list_filter = []  # 过滤器
    search_fields = ['id', 'date_time']  # 搜索


@admin.register(AppInfo)
class AppInfoAdmin(admin.ModelAdmin):
    """app信息管理类"""
    list_per_page = 15  # 每页显示多少条数据
    list_display = ['id', 'app_name', 'app_secret', 'app_package', 'app_version', 'app_desc', 'uid_belong', 'uid',
                    'type', 'created_at', 'updated_at']  # 展示字段
    ordering = ['id']  # ordering设置默认排序字段,负号表示降序排序
    list_filter = ['app_name', 'type']  # 过滤器
    search_fields = ['id', 'uid_belong', 'uid', 'app_name']  # 搜索
    list_display_links = ['id', 'app_name', 'app_secret', 'app_package', 'app_version', 'app_desc', 'uid_belong', 'uid',
                          'type', 'created_at', 'updated_at']  # 设置哪些字段可以点击进入编辑界面


@admin.register(DevicedInfo)
class DevicedInfoAdmin(admin.ModelAdmin):
    """设备信息管理类"""
    list_per_page = 15  # 每页显示多少条数据
    list_display = ['id', 'did_uuid', 'imei', 'imsi', 'openudid', 'ssid', 'wifi_mac', 'phone_name', 'os', 'os_version',
                    'vendor', 'model', 'language', 'created_at',
                    'updated_at']  # 展示字段
    ordering = ['id']  # ordering设置默认排序字段,负号表示降序排序
    list_filter = ['os', 'language']  # 过滤器
    search_fields = ['id', 'vendor', 'language']  # 搜索


@admin.register(Region)
class RegionAdmin(admin.ModelAdmin):
    """位置信息管理类"""
    list_per_page = 15  # 每页显示多少条数据
    list_display = ['id', 'latitude', 'longitude', 'country', 'province', 'city', 'district']  # 展示字段
    ordering = ['id']  # ordering设置默认排序字段,负号表示降序排序


@admin.register(Schedules)
class SchedulesAdmin(admin.ModelAdmin):
    """广告排期管理类"""
    fields = ['ad_postion', 'ad_material', 'ad_third_res', 'begin_time2', 'end_time2',
              'state', 'type', 'region_id', 'freq', 'uniform', 'uid']
    list_per_page = 15  # 每页显示多少条数据
    list_display = ['id', 'ad_postion', 'ad_material', 'ad_third_res', 'begin_time2', 'end_time2',
                    'state', 'type', 'region_id', 'freq', 'uniform', 'uid', 'created_at', 'updated_at']  # 展示字段
    ordering = ['id']  # ordering设置默认排序字段,负号表示降序排序
    list_filter = ['state', 'uniform']  # 过滤器
    search_fields = ['id', 'uid']  # 搜索
    list_display_links = ['id', 'ad_postion', 'ad_material', 'ad_third_res', 'begin_time2', 'end_time2', 'state',
                          'type', 'region_id', 'freq', 'uniform', 'uid', 'created_at',
                          'updated_at']  # 设置哪些字段可以点击进入编辑界面


@admin.register(UploadFile)
class UploadFileAdmin(admin.ModelAdmin):
    """上传文件管理类"""
    list_per_page = 15  # 每页显示多少条数据
    list_display = ['id', 'name', 'file_id', 'url']  # 展示字段
    ordering = ['id']  # ordering设置默认排序字段,负号表示降序排序


@admin.register(User)
class UserAdmin(admin.ModelAdmin):
    """用户管理类"""
    list_per_page = 15  # 每页显示多少条数据
    list_display = ['id', 'name', 'pwd', 'content_user', 'content_phone', 'content_mail',
                    'content_address', 'type', 'uid', 'session_key', 'session_key2', 'session_expire_date',
                    'created_at', 'updated_at']  # 展示字段
    ordering = ['id']  # ordering设置默认排序字段,负号表示降序排序
    list_filter = ['type']  # 过滤器
    search_fields = ['id', 'uid', 'name', 'content_phone']  # 搜索
    list_display_links = ['id', 'name', 'pwd', 'content_user', 'content_phone', 'content_mail',
                          'content_address', 'type', 'uid', 'session_key', 'session_key2',
                          'session_expire_date', 'created_at', 'updated_at']  # 设置哪些字段可以点击进入编辑界面

猜你喜欢

转载自blog.csdn.net/zhu6201976/article/details/86628316
今日推荐