在django中检查具有相同m2m关系的对象是否存在?

在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") 
+0

您可以在保存教师的位置添加您的views.py代码,以便我可以看到数据如何收集以及如何创建对象? – Mikael 2012-08-13 12:59:28

+0

我已更新我的代码。请告诉我如何检查 – user1170793 2012-08-13 13:14:13

+1

“Sobject”对象来自哪里? – juankysmith 2012-08-13 13:18:32

显得比较简单。只要做到了与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 

这解决了你的问题的确切情况;如果您想要处理指定课程是现有教师课程的子集的情况(例如,如果您决定允许添加两门课程的教师),则需要更多思考。

+0

太好了,谢谢..但是这个查询需要更多时间才能执行还是很好? – user1170793 2012-08-14 05:59:23

+0

我不确定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") 
+0

qs = reduce(lambda q,c:q.filter(course = c),c for c in [id1,id2,id3],qs)有一些语法错误“表达式必须加括号如果不是唯一的参数“ – user1170793 2012-08-13 13:27:43

+0

我已更新我的代码 – Mikael 2012-08-13 13:38:38

+0

没有它没有工作,我可以添加具有相同m2m关系的多个对象.qs始终是空的,因此它始终创建具有相同m2m关系的新对象。:( – user1170793 2012-08-13 13:48:36

在相关的答案,但不完全是针对这种情况,你可以检查对象是否是一种M2M有:

if english_course in teacher.courses.all(): 
    # already in there :) 

我只是认为这是一个很好的办法做到这一点。