Django小常识

Django中自定义命令

  • 在任意一个应用下,创建如下包目录:

    # 在每个 app 目录下,新建一个 management/commands 目录,Django 会给目录下的每个 Python 文件注册一个 manage.py 命令,这个命令的名字不以下划线开头。
    polls/
        __init__.py
        models.py
        management/
            __init__.py
            commands/
                __init__.py
                _private.py
                closepoll.py
        tests.py
        views.py
    
  • 在commands 目录下创建命令文件,命令的名称就是命令文件的名称,命令文件内部的基本结构如下:

    __author__ = 'geebos'
    from django.core.management.base import BaseCommand, CommandError
    from app.models import UserInfo
    import os
    import csv
    
    
    class Command(BaseCommand):
        help = '导入数据,以逗号分隔的csv文件,编码为UTF-8npython manage.py import_data 数据文件路径'
    
        def add_arguments(self, parser):
             parser.add_argument('path', type=str)
    
        def handle(self, *args, **options):
            path = options['path']
            if not os.path.isfile(path):
                raise CommandError('文件不存在')
    
            print('正在导入...')
            with open(path, 'r', newline='', encoding='utf-8_sig') as f:
                reader = csv.DictReader(f)
    
                for t in reader:
                    UserInfo.objects.create(**dict(t))
            print('导入完成')
    
    
    • 首先定义一个Command类(注意这个类名不能改变,并且一个文件内只能有一个Command类),这个类继承自 django.core.management.base.BaseCommand.
    • help为命令的帮助文档,当输入错误指令时输出help的内容
    • add_arguments函数用来添加参数,如果没有参数可以不定义这个函数。在这个函数里通过调用 parse.add_argument来添加参数.
    • handle是命令的处理函数,可以通过 options来取得从命令行输入的参数。

Django中外键小常识

外键关联的是一个对象,自己主动生成的外键名称会在关联的对象的名称后面加上_id来作为字段名称

默认情况下,外键会自己主动创建索引,会自己主动做级联删除,默认的外键是字段那张表的主键

关于ForeignKey.on_delete的几个选项

SET_NULL当外键的字段被删除的时候设置为null前提是指定了null=True

CASCADE 默认的选项,当外键关联的字段删除的时候。全部其它表级联删除

ET_DEFAULT 设置一个默认值,当关联的记录删除的时候恢复成默认值

DO_NOTHING  django不做不论什么事情。数据库返回什么就报什么

SET 还能够set一个函数,当关联记录删除的时候触发得到一个值

Protect:删除ForeignKey关联对象时会生成一个ProtectedError,这样ForeignKey关联对象就不会被删除了

Django model中的Class Meta详解

通过一个内嵌类“Class meta”给你的model定义元数据

class CourseCategory(BaseModel):
    name = models.CharField(max_length=64,unique=True,verbose_name='分类名称')
    ...
    class Meta:
        db_table = "luffy_course_category"
        ...

以下所有可能用到的meta选项,没有一个选项是必须的

  • app_label

    app_label这个选项只在一种情况下使用,就是你的模型类不在默认的应用程序包下的models.py文件中,这时候你需要指定你这个模型类是那个应用程序的。比如你在其他地方写了一个模型类,而这个模型类是属于myapp的,那么你这是需要指定:app_label='myapp'

  • db_table

    db_table是用于指定自定义数据库表名的。Django有一套默认的按照一定规则生成数据模型对应的数据库表名,如果你想使用自定义的表名,就通过这个属性指定,比如:table_name='luffy_course_category'

  • db_tablespace

    有些数据库有数据库表空间,比如Oracle。你可以通过db_tablespace来指定这个模型对应的数据库表放在哪个数据库表空间。

  • get_latest_by

    由于Django的管理方法中有个lastest()方法,就是得到最近一行记录。如果你的数据模型中有 DateField 或 DateTimeField 类型的字段,你可以通过这个选项来指定lastest()是按照哪个字段进行选取的。

    一个 DateField 或 DateTimeField 字段的名字. 若提供该选项, 该模块将拥有一个 get_latest() 函数以得到 "最新的" 对象(依据那个字段):get_latest_by = "order_date"

  • permissions

    permissions主要是为了在Django Admin管理模块下使用的,如果你设置了这个属性可以让指定的方法权限描述更清晰可读。

    要创建一个对象所需要的额外的权限. 如果一个对象有 admin 设置, 则每个对象的添加,删除和改变权限会人(依据该选项)自动创建.下面这个例子指定了一个附加权限: can_deliver_pizzas: permissions = (("can_deliver_pizzas", "Can deliver pizzas"),)

  • verbose_name

    verbose_name的意思很简单,就是给你的模型类起一个更可读的名字:verbose_name = "pizza"

  • verbose_name_plural

    这个选项是指定,模型的复数形式是什么,比如:verbose_name_plural = "stories"

  • ordering

    这个字段是告诉Django模型对象返回的记录结果集是按照哪个字段排序的

posted @ 2025-08-19 22:40  小郑[努力版]  阅读(12)  评论(0)    收藏  举报