1. 程式人生 > 其它 >django學習之model

django學習之model

定義兩個樣例模型:

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、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、儲存ForeignKeyManyToManyField欄位

更新ForeignKey欄位的方式與儲存普通欄位的方式相同——只需將正確型別的例項分配給相關欄位。本例為Entry類的例項entry更新了blog屬性,假設EntryBlog的例項均已儲存在資料庫中(因此能在下面檢索它們):

官方文件:
>>> 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)