Django開發之自定義管理器、ORM關聯表、事務
前言:向管理器類中添加額外的方法,如一些常用的增刪改查操作,view層只需要調用即可。ORM關聯表、事務的使用。注意:此Django是基於3.0.2版本的,裏面有些方法可能與老版本有些出入,使用的時候請注意!
1.新建模型類
from django.db import models
class Country(models.Model):
name = models.CharField(max_length=100)
class Meta:
db_table = 'country'
verbose_name = '國家'
verbose_name_plural = verbose_name
class Student(models.Model):
name = models.CharField(max_length=200)
grade = models.PositiveSmallIntegerField()
country = models.ForeignKey(Country,on_delete=models.PROTECT)
objects = ManagerStudent()
class Meta:
db_table = 'student'
verbose_name = '學生'
verbose_name_plural = verbose_name
2.自定義模型類
在Student類中添加:
objects = ManagerStudent()
然後新建一個ManagerStudent類,繼承models.Manager方法
class ManagerStudent(models.Manager):
pass
3.在自定義模型類添加增刪改查方法
class ManagerStudent(models.Manager):
def query(self):
student = self
"""查詢"""
qs = student.values()
return {'ret': 0, 'retlist': list(qs)}
def add_one(self,name,grade,country_id):
"""增加"""
student = None
try:
student = self.get(name=name)
except:
student = None
if student:
return {'ret': 1, 'msg': '已經存在'}
else:
data = self.create(name=name, grade=grade, country_id=country_id)
print(data)
return {'ret': 0}
def modify(self,id,name,grade,country_id):
"""修改"""
student = None
try:
studnet = self.get(id=id)
except:
return {'ret':1,'msg':'客戶不存在'}
studnet.name = name
studnet.grade = grade
studnet.country_id = country_id
studnet.save()
return {'ret':0,'msg':'修改成功'}
def delete(self,id):
"""刪除"""
student = None
try:
student = self.get(id=id)
except student.DoesNotExist:
return {'ret':1,'msg':'客戶不存在'}
student.delete()
return {'ret':0,'msg':'刪除成功'}
注意:調用的時候,只需要Student.objects.方法(參數),即可。
4.ORM關聯表、事務
4.1 通過對象訪問外鍵表
s1 = Student.objects.get(name='fly1')
country_name = s1.country.name
print(country_name)
4.2 根據外鍵表數據過濾
data = Student.objects.filter(grade=1, country__name='中國').values()
print(list(data))
4.3 反向訪問
cn = Country.objects.get(name='中國')
data = cn.student_set.values()
print(list(data))
4.4 反向過濾
data = Country.objects.filter(student__grade=1).values().distinct()
print(list(data))
結束!!!