检查项目是否在ManyToMany字段中?

时间:2014-01-05 08:28:01

标签: python django

考虑这个模型:

class pm_thread(models.Model):
    subject = models.CharField(max_length=200)
    participants = models.ManyToManyField(User)

检查用户是否在ManyToManyField中的最佳方法是什么?例如:

thread = get_object_or_404(pm_thread, pk=thread_id)
if not thread.participants.contains(request.user):
    return HttpResponse("403 FORBIDDEN",status=403)

3 个答案:

答案 0 :(得分:3)

您可以使用in运算符:

if not request.user in thread.participants.all():
    ...

答案 1 :(得分:1)

其他答案调用.all(),该查询进行查询以检索关系中的所有对象(所有参与者),然后使用Python代码检查是否包含该用户。

一种更好的方法是使用过滤的查询来查询用户是否直接包含在关系中。

if not thread.participants.filter(id=request.user.id).exists():
    return HttpResponse("403 FORBIDDEN",status=403)

请注意,thread.paricipants本身就是Django QuerySet。

答案 2 :(得分:0)

由于我无法在@Harmish下发表评论,因此我必须指出,在PEP8标准下,成员资格应为x not in,而不是not x in

因此,您的代码如下所示:

if request.user not in thread.participants.all():
    ...

来源:https://www.python.org/dev/peps/pep-0008/#programming-recommendations