【问题标题】:Filter objects in ManyToMany relationship by multiple criteria按多个条件过滤多对多关系中的对象
【发布时间】:2020-02-25 21:13:47
【问题描述】:

我想获取我的“Collection”对象的模型实例,其中“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”也会破坏我的数据库完整性吗?

【问题讨论】:

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


    【解决方案1】:

    您可以使用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 作为owner,使用PROTECT 可能会更好。

    【讨论】:

    • 谢谢!我将 pk=collection_id 添加到每个 Q 中,我得到了我需要的东西。如果我首先通过 pk 获取对象并在从 db 获取对象后检查关系是否更有效?
    • @mmdfan:不,因为在数据库中使用JOIN 检查关系。因此,如果您自己检查关系,这将在 一个 查询中完成,而不是多个查询。
    猜你喜欢
    • 2017-04-26
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多