Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查django中是否存在具有相同m2m关系的对象?_Django_Django Models_Django Queryset - Fatal编程技术网

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

检查django中是否存在具有相同m2m关系的对象?,django,django-models,django-queryset,Django,Django Models,Django Queryset,我有一位这样的模范教师: name = models.CharField(max_length=100,unique=True) course = models.ManyToManyField(Course) 课程模式: course_name = models.CharField(max_length=100,unique=True) 在创建教师对象时,我希望确保我正在创建的新对象不应与任何其他现有教师对象具有相同的课程(m2m关系) 例如,如果教师对象A具有英语、数学、历史m2m课程关系

我有一位这样的模范教师:

name = models.CharField(max_length=100,unique=True)
course = models.ManyToManyField(Course)
课程模式:

course_name = models.CharField(max_length=100,unique=True)
在创建教师对象时,我希望确保我正在创建的新对象不应与任何其他现有教师对象具有相同的课程(m2m关系)

例如,如果教师对象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")
好了,开始了

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")
好了,开始了

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")

看起来比较简单。只需使用
请求中指定的所有课程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

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

似乎相对简单。只需使用
请求中指定的所有课程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

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

在相关答案中,但不完全适用于这种情况,您可以检查对象是否位于m2m中,其中包括:

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

我只是觉得这是一个很好的方法。

在相关的回答中,但并不完全适用于这种情况,您可以通过以下方式检查对象是否位于m2m中:

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


我只是觉得这是一个很好的方法。

你可以添加你的视图吗。py代码保存老师的位置,这样我就可以看到数据是如何收集的以及对象是如何创建的?我已经更新了我的代码。请告诉我如何检查“Sobject”对象来自何处?抱歉@juankysmith我更新了我的代码。请添加你的视图。py在哪里保存老师的代码,以便我可以看到数据是如何收集的以及对象是如何创建的?我已经更新了我的代码。请告诉我如何检查“Sobject”对象来自哪里?抱歉@juankysmith我更新了我的codeqs=reduce(lambda q,c:q.filter(course=c),c for c in[id1,id2,id3],qs)有一些语法错误“如果表达式不是唯一参数,则必须将其括起来”否“它不起作用,我可以添加具有相同m2m关系的多个对象。qs始终为空,因此它始终创建具有相同m2m关系的新对象:(你必须检查为什么qs总是空的。有效的id1参数是什么样子的?它包含什么?好的。但是非常感谢@Mikael帮助我…你真是太好了:)@Mikael,检查PEP8,这个。用
Vobject
这样的变量代替
variable
也有点混乱…qs=reduce(lambda q,c:q.filter)(course=c,[id1,id2,id3],qs)中的c代表c有一些语法错误“如果不是唯一的参数,表达式必须用括号括起来”不,它不起作用,我可以添加具有相同m2m关系的多个对象。qs始终为空,因此它总是创建具有相同m2m关系的新对象:(你必须检查为什么qs总是空的。有效的id1参数是什么样子的?它包含什么?好的。但是非常感谢@Mikael帮助我…你太好了:)@Mikael,看看PEP8。用
Vobject
这样的变量代替
variable
也有点让人困惑…太好了,谢谢..但是执行这个查询会花费更多的时间吗?还是很好?我不确定Django是否足够聪明,能够意识到这个查询可以在没有
连接的情况下完成,但即使没有,我们仍然是我说的是一个有3个
条件的单一查询,其中
条件:这肯定是gnarly查询范围的低端。太好了,谢谢。但是这个查询执行起来会花费更多的时间吗?我不确定Django是否足够聪明,能够意识到这个查询可以在没有
连接的情况下完成,但即使不是,我们也不是直到谈到一个带有3个
条件的单一查询,其中
条件:这肯定是gnarly查询范围的低端。