如何同时过滤 Django 模型的 AND 和 OR

问题描述 投票:0回答:1

假设我有一个用户模型和一个数据集模型。我想获取所有数据集(具有某种类型并且(属于某个用户或不属于任何人))。实现这一目标的最佳方法是什么?

代码示例:

class User(AbstractUser):
    username = models.CharField(max_length=150,unique=True,)
    first_name = models.CharField(blank=True, max_length=150)
    last_name = models.CharField(blank=True, max_length=150)


class Dataset(models.Model):
    name = models.CharField(null=False, unique=True, max_length=50)
    type = (models.PositiveIntegerField())
    UserID = models.ForeignKey(
        User,
        null=True,
        blank=True,
        on_delete=models.CASCADE,
        related_name="ds_owner",
    )

我想弄清楚如何选择这样的东西:

def view_name(request):
    usr = User.objects.get(id=request.user.id) 
    allowed_datasets = Dataset.objects.filter(type=1 AND (UserID=usr OR UserID__isnull=True))
python django django-models django-queryset django-filter
1个回答
0
投票

您可以使用

Q
对象 [Django-doc] 将过滤选项呈现为对象,然后使用
&
|
进行连词和析取。

因此您可以使用以下方式进行过滤:

from django.db.models import Q


def view_name(request):
    usr = User.objects.get(id=request.user.id)
    allowed_datasets = Dataset.objects.filter(
        Q(type=1) & (Q(UserID=usr) | Q(UserID=None))
    )

或更短:

from django.db.models import Q


def view_name(request):
    usr = User.objects.get(id=request.user.id)
    allowed_datasets = Dataset.objects.filter(
        Q(UserID=usr) | Q(UserID=None), type=1
    )

注意:通常最好使用

get_object_or_404(…)
 [Django-doc], 然后直接使用
.get(…)
 [Django-doc]
。如果该对象不存在, 例如,因为用户自己更改了 URL,
get_object_or_404(…)
将导致返回 HTTP 404 Not Found 响应,而使用
.get(…)
将导致 HTTP 500 服务器错误

© www.soinside.com 2019 - 2024. All rights reserved.