假设我有一个用户模型和一个数据集模型。我想获取所有数据集(具有某种类型并且(属于某个用户或不属于任何人))。实现这一目标的最佳方法是什么?
代码示例:
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))
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
)
[Django-doc], 然后直接使用get_object_or_404(…)
[Django-doc]。如果该对象不存在, 例如,因为用户自己更改了 URL,.get(…)
将导致返回 HTTP 404 Not Found 响应,而使用get_object_or_404(…)
将导致 HTTP 500 服务器错误。.get(…)