在django中检查具有相同m2m关系的对象是否存在?
我有这样一个模范教师:在django中检查具有相同m2m关系的对象是否存在?
name = models.CharField(max_length=100,unique=True)
course = models.ManyToManyField(Course)
,当然型号:
course_name = models.CharField(max_length=100,unique=True)
在创建教师目标我想,以确保新的对象,我创建不应该有相同的课程( m2m关系)与其他任何现有的Teacher对象。
例如,如果教师体A 英语,数学,历史 M2M课程的关系,所以没有新的教师对象可以有英语,数学,历史。
查看
def AddTeacher(request):
#id's are the courses object id
id1 = request.POST.get('id1')
id2 = request.POST.get('id2')
id3 = request.POST.get('id3')
Tobject = Teacher(name="temp")
Tobject.save()
for i in [id1,id2,id3]:
Cobject = Course.objects.get(id=i)
Tobject.course.add(Cobject)
Tobject.name = "Teacher"+str(Tobject.id)
Tobject.save()
temp = {}
temp['message'] = "Object created successfully"
return HttpResponse(json.dumps(temp),mimetype="application/json")
显得比较简单。只要做到了与request.POST
规定的所有课程ID的老师查询和保释如果有任何结果:
def AddTeacher(request):
#id's are the courses object id
id1 = request.POST.get('id1')
id2 = request.POST.get('id2')
id3 = request.POST.get('id3')
if Teacher.objects.filter(course=id1).filter(course=id2).filter(course=id3).count() > 0:
return HttpResponseForbidden("Can't add a teacher with these courses; one already exists")
# ... function continues
这解决了你的问题的确切情况;如果您想要处理指定课程是现有教师课程的子集的情况(例如,如果您决定允许添加两门课程的教师),则需要更多思考。
太好了,谢谢..但是这个查询需要更多时间才能执行还是很好? – user1170793 2012-08-14 05:59:23
我不确定Django是否足够聪明,可以在没有'JOIN'的情况下实现这个查询,但即使不是,我们仍然在讨论带有3个WHERE条件的单个查询:这绝对是在较低粗糙的查询频谱结束。 – supervacuo 2012-08-14 13:24:45
确定这里有云
def AddTeacher(request):
#id's are the courses object id
id1 = request.POST.get('id1')
id2 = request.POST.get('id2')
id3 = request.POST.get('id3')
qs = Teacher.objects.all()
#Build a dynamic filter query
qs = reduce(lambda q, c: q.filter(course=c), [c for c in [id1, id2, id3]], qs)
if qs:
raise ValueError("A teacher with the selected courses already exists")
teacher = Teacher(name="temp")
teacher.save()
for i in [id1, id2, id3]:
course = Course.objects.get(id=i)
teacher.course.add(course)
teacher.name = "Teacher"+str(teacher.id)
teacher.save()
return HttpResponse(json.dumps({
'message': 'Object created successfully'
}), mimetype="application/json")
qs = reduce(lambda q,c:q.filter(course = c),c for c in [id1,id2,id3],qs)有一些语法错误“表达式必须加括号如果不是唯一的参数“ – user1170793 2012-08-13 13:27:43
我已更新我的代码 – Mikael 2012-08-13 13:38:38
没有它没有工作,我可以添加具有相同m2m关系的多个对象.qs始终是空的,因此它始终创建具有相同m2m关系的新对象。:( – user1170793 2012-08-13 13:48:36
在相关的答案,但不完全是针对这种情况,你可以检查对象是否是一种M2M有:
if english_course in teacher.courses.all():
# already in there :)
我只是认为这是一个很好的办法做到这一点。
您可以在保存教师的位置添加您的views.py代码,以便我可以看到数据如何收集以及如何创建对象? – Mikael 2012-08-13 12:59:28
我已更新我的代码。请告诉我如何检查 – user1170793 2012-08-13 13:14:13
“Sobject”对象来自哪里? – juankysmith 2012-08-13 13:18:32