Django Models 常用操作及问题解决

model.XXX.objects.get()不存在字段解决方案

如何判断从表单发送过来的用户名及密码是否在数据库中存在?

使用model.User.objects.get(username = username)的时候如果不存在查询的值的话将会抛出一个DoesNotExist的异常

可以使用try捕获此异常进行判断:

from django.core.exceptions import ObjectDoesNotExist
if request.method == 'POST':
		username = request.POST.get('username')
		passwd = mainHandle.getMd5(request.POST.get('passwd'))
		try:
			result = models.Admin.objects.get(username = username, passwd = passwd)
			pageObj = redirect('/admin/manage/')
			pageObj.set_signed_cookie('ck','log',salt = 'ck_liang')
			return pageObj
		except ObjectDoesNotExist:
			....


批量插入数据

	models.Class.objects.bulk_create([
			models.Class(cname = 'python'),
			models.Class(cname = 'java'),
			models.Class(cname = 'html5'),
			models.Class(cname = 'php'),
			models.Class(cname = 'django'),
			models.Class(cname = 'javascript'),
		])
teacherClass = []
for nameId in newCnameId:
	teacherClass.append(models.TeacherClass(tid_id = tid, cid_id = nameId))
models.TeacherClass.objects.bulk_create(teacherClass)


多表联查

tList = A.objects.filter(name = 'admin').values_list('name','age', flat=True) # flat = True 返回一个列表,默认返回元组列表
B.objects.filter(name__in=tList).values_list('class')


通过外键多表联查

teacher和class表通过中间表关联,并且为中间表设置外键

class Teacher(models.Model):
	tid = models.AutoField(primary_key = True)
	tname = models.CharField(max_length = 5)

class Class(models.Model):
	cid = models.AutoField(primary_key = True)
	cname = models.CharField(max_length = 15)

class TeacherClass(models.Model):
	tcid = models.AutoField(primary_key = True)
	tid = models.ForeignKey(Teacher)
	cid = models.ForeignKey(Class)

通过中间表的外键正向查询

obj = models.TeacherClass.objects.filter(cid_id = 5) # 返回QuerySet对象列表
	for row in obj:
		print(row.tid.tname) # 通过当前表的外键字段正向查找cid_id = 5的教师表中的教师姓名

反向查询

obj = models.Teacher.objects.get(tid = 4) # 返回QuerySet对象列表
	for row in obj.teacherclass_set.all(): # 反向查找的表名需全部小写并加上_set
		print(row.cid_id)

values()取值时的正向跨表查询 - (外键名__字段名)

obj = models.TeacherClass.objects.filter(tid_id = 5).values('cid_id','tid__tname') # 返回字典
print(obj)

猜你喜欢

转载自blog.csdn.net/zwliang98/article/details/80646241
今日推荐