第2课 django 学生管理系统-模型(Model)设计

Model (模型) 简而言之即数据模型。

本次系统主要包括以下字段:

CharField() 字符字段

必选参数 max_length = xxx or None
如不是必填项,可设置blank = True和default = ”
如果用于username, 想使其唯一,可以设置unique = True
如果有choice选项,可以设置 choices = XXX_CHOICES

TextField() 文本字段

必选参数 max_length = xxx
如不是必填项,可设置blank = True和default = ”

DateField() and DateTimeField() 日期与时间字段

一般建议设置默认日期default date.
For DateField: default=date.today – 先要from datetime import date
For DateTimeField: default=timezone.now – 先要from django.utils import timezone
对于上一次修改日期(last_modified date),可以设置: auto_now=True

IntegerField() 数字字段

可以设置blank = True or null = True

SlugField(), URLField(),BooleanField()

可以设置blank = True or null = True
对于BooleanField一般建议设置defautl = True or False

ForeignKey(to, on_delete, **options) – 单对多关系

to必需指向其他模型,比如 Book or ‘self’ . (必选)
必需指定on_delete options(删除选项): i.e, “on_delete = models.CASCADE” or “on_delete = models.SET_NULL” . (必选)
可以设置”default = xxx” or “null = True” .
如果有必要,可以设置 “limit_choices_to = “,如下面例子。
staff_member = models.ForeignKey( User, on_delete=models.CASCADE, limit_choices_to={‘is_staff’: True}, )
可以设置 “related_name = xxx” 便于反向查询。

ManyToManyField(to, **options) – 多对多关系

to 必需指向其他模型,比如 User or ‘self’ . (必选)
设置 “symmetrical = False ” if 多对多关系不是对称的
设置 “through = ‘intermediary model’ ” 如果需要建立中间模型来搜集更多信息
可以设置 “related_name = xxx” 便于反向查询。

ImageField(upload_to=None, height_field=None, width_field=None, max_length=100,)

upload_to = “/some folder/” (必选)
其他选项是可选的.

FileField(upload_to=None, max_length=100) – 文件字段

upload_to = “/some folder/” (必选)
max_length = xxxx

编写第一个models.py表结构


# 学生管理
class StudentModel(models.Model):
    #sex_tur = ([1, "男"], [2, "女"]) #元组-() 列表-[] 字典/集合-{}


    code = 'xs0001' #GradeModel.objects.get(pk=1) #
    no = models.CharField(max_length=50, verbose_name="学号", default=code)
    name = models.CharField(max_length=50, verbose_name="姓名")
    photo = models.ImageField(upload_to='', max_length=200, blank = True, null=True, verbose_name="照片")
    age = models.IntegerField(default=0, verbose_name="年龄")
    sex = models.IntegerField(
        choices=([1, "男"], [2, "女"]), default=1, verbose_name="性别"
    )
    grade = models.ForeignKey(to=GradeModel, verbose_name='年级', on_delete=models.CASCADE, blank=True, null=True)

    native = models.CharField(max_length=50, verbose_name="籍贯", blank = True, null = True)
    school_time = models.DateField(verbose_name="入学日期", blank = True, null = True)
    family = models.CharField(max_length=250, verbose_name="家庭地址", blank = True, null = True)
    create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")

    def __str__(self):
        return self.name
    
    class Meta:
        verbose_name = '学生管理'
        verbose_name_plural = verbose_name

    def create_no(self):
        """生成学号"""
        now_date = date.today().strftime('%Y')
        id_str = str(self.id).zfill(4)
        return 'XS' + str(now_date) + id_str

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs) 
        self.no = self.create_no()
        super().save(*args, **kwargs)  # 执行真正的 .save() 方法.

编写第一个admin.py内容


# 学生管理
class StudentAdmin(admin.ModelAdmin):
	list_display = ('no','name', 'get_photo', 'age', 'sex', 'grade', 'native', 'school_time', 'family', 'create_time', 'update_time') # list 显示的字段
	search_fields = ('no','name', ) #admin列表可以用来搜索的字段
	list_filter = ('grade', ) #admin页面右侧过滤栏
	list_editable = ('sex', ) #admin页面可编辑字段
	#list_per_page admin列表页分页效果
	#list_display_links 进入详情页的链接
	#fields 自定义表单
	fields = ('name', 'photo', 'age', 'sex', 'grade', 'native', 'school_time', )
	def get_photo(self, obj):
		#print(obj.photo)
		return format_html('<img src="{}" width="50" height="50" />'.format(f'/uploads/{obj.photo}'))

	get_photo.short_description = '照片'

admin.py字段说明



'''设置列表可显示的字段'''
list_display = ('title', 'author',  'status', 'mod_date',)

'''设置过滤选项'''
list_filter = ('status', 'pub_date', )

'''每页显示条目数'''
list_per_page = 5

'''设置可编辑字段'''
list_editable = ('status',)

'''按日期月份筛选'''
date_hierarchy = 'pub_date'

'''按发布日期排序'''
ordering = ('-mod_date',)
This entry was posted in 应用. Bookmark the permalink.

发表评论