定义两个样例模型:
class Role(models.Model): """ 角色 """ name = models.CharField(verbose_name='角色名称', max_length=32, unique=True) permissions = models.ManyToManyField('Permission', verbose_name='权限', blank=True) desc = models.CharField(verbose_name='描述', max_length=50, blank=True) class Meta: verbose_name = '角色' verbose_name_plural = verbose_name ordering = ['id'] def __str__(self): return self.name class Permission(models.Model): """ 权限 """ name = models.CharField(verbose_name='权限名称', max_length=32, unique=True) path = models.CharField(verbose_name='URL', blank=True, max_length=128) method = models.CharField(verbose_name='方法', max_length=16, default='GET') pid = models.ForeignKey('self', verbose_name='上级权限', null=True, blank=True, on_delete=models.SET_NULL) class Meta: verbose_name = '权限' verbose_name_plural = verbose_name ordering = ['id'] def __str__(self): return self.name
一旦创建 数据模型 后,Django 自动给予你一套数据库抽象 API,允许你创建,检索,更新和删除对象
一、model模型之数据查询
1、用 get()
检索单个对象
若你知道只会有一个对象满足查询条件,你可以在 Manager
上使用 get()
方法,它会直接返回这个对象,可以通过object.field获取字段的值
In [1]: from apps.rbac.models import Role,Permission In [2]: role_object = Role.objects.get(id=2) In [3]: role_object Out[3]: <Role: member> In [4]: role_object.id Out[4]: 2 In [5]: role_object.name Out[5]: 'member'
2、
3、 ManyToManyField
多对多数据查询方式
查询某个角色有哪些权限
In [1]: from apps.rbac.models import Role,Permission In [2]: role_object = Role.objects.get(id=2) In [6]: Permission.objects.filter(role=role_object) Out[6]: <QuerySet [<Permission: 文件列表>, <Permission: 操作日志>]> In [7]: Permission.objects.filter(role=role_object).values() Out[7]: <QuerySet [{'id': 3, 'name': '文件列表', 'path': '/file/list', 'method': 'GET', 'pid_id': None}, {'id': 4, 'name': '操作日志', 'path': '/file/operatelog', 'method': 'GET', 'pid_id': None}]> In [8]: Permission.objects.filter(role=role_object).values('path') Out[8]: <QuerySet [{'path': '/file/list'}, {'path': '/file/operatelog'}]> In [9]: Permission.objects.filter(role=role_object).values_list('path') Out[9]: <QuerySet [('/file/list',), ('/file/operatelog',)]> In [10]: list(Permission.objects.filter(role=role_object).values_list('path')) Out[10]: [('/file/list',), ('/file/operatelog',)] In [11]: list(Permission.objects.filter(role=role_object).values_list('path',flat=True)) Out[11]: ['/file/list', '/file/operatelog']
In [13]: Permission.objects.filter(role__id__contains=2)
Out[13]: <QuerySet [<Permission: 文件列表>, <Permission: 操作日志>]>
In [14]: list(Permission.objects.filter(role__id__contains=2).values_list('path',flat=True))
Out[14]: ['/file/list', '/file/operatelog']
二、model模型之数据写入
1、保存 ForeignKey
和 ManyToManyField
字段
更新 ForeignKey
字段的方式与保存普通字段的方式相同——只需将正确类型的实例分配给相关字段。本例为 Entry
类的实例 entry
更新了 blog
属性,假设 Entry
和 Blog
的实例均已保存在数据库中(因此能在下面检索它们):
官方文档: >>> from blog.models import Blog, Entry >>> entry = Entry.objects.get(pk=1) >>> cheese_blog = Blog.objects.get(name="Cheddar Talk") >>> entry.blog = cheese_blog >>> entry.save() 实践: productline = request.POST.get('productline').strip() file_list = { 'filename': file.name, 'productline': productline 'describe': request.POST.get('describe', ''), } FileProperty.objects.create(**file_list)