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',)