通过多个条件过滤ManyToMany关系中的对象

时间:2020-02-25 21:13:47

标签: django python-3.x django-models django-views

我想获取我的“集合”对象的模型实例,其中“ request.user”处于“所有者”或“贡献者”关系中,且该对象的ID为“ collection_id”。这是我的代码:

models.py

    class Collection(models.Model):
        title = models.CharField(max_length=250, unique=True)
        owner = models.ForeignKey(User, related_name='owner', on_delete=models.DO_NOTHING)
        contributors = models.ManyToManyField(User, related_name='contributors', blank=True)

views.py

    def collection_edit(request, collection_id)
        ...
        # Here I want to check if request.user is in contributors or owner
        collection = Collection.objects.filter(owner_id=request.user, pk=collection_id).first()
        # Do stuff
        ...

如果删除用户,所有者关系中的'on_delete = models.DO_NOTHING'是否也会破坏我的数据库完整性?

1 个答案:

答案 0 :(得分:2)

您可以使用Q个对象进行过滤:

from django.db.models import Q

Collection.objects.filter(Q(owner=request.user) | Q(contributors=request.user))

因此,我们在这里检索Collection个对象,其中ownerrequest.user request.user是其中之一。如果他既是所有者又是贡献者,那么它也将是集合的一部分。

如果删除用户,on_delete=models.DO_NOTHING的所有者关系还会破坏我的数据库完整性吗?

是,因为那意味着此时的user_id字段将包含一个不再存在的用户的主键值。但是,大多数数据库不允许允许这样做,并引发一个IntegrityError。如果您不希望让Django删除User,而仍然有Collectionuser的{​​{1}},则最好使用PROTECT。 / p>