[英]How to create default filter on django queryset
我的 django 應用程序中有以下模型:
class Segment(BaseSegmentModel):
payload_json = JSONField(null=True, default=None, blank=True)
owner = models.ForeignKey(CustomUser, null=True, blank=True, on_delete=models.SET_NULL, related_name='segments')
name = models.CharField(max_length=100, null=True, blank=False)
status = models.CharField(max_length=100, null=True, blank=True, choices=SegmentStatuses.choices, default=SegmentStatuses.STOPPED)
created_date = models.DateTimeField(null=True, auto_now_add=True)
有一個字段狀態,它具有三個值:
class SegmentStatuses:
STOPPED = 'stopped'
ACTIVE = 'active'
ARCHIVE = 'archive'
choices = ((STOPPED, STOPPED), (ACTIVE, ACTIVE), (ARCHIVE, ARCHIVE))
我需要在這個模型上添加一個默認過濾器,它不應該顯示任何帶有status = Archive
的結果。
因此,每當有人查詢此模型時,它都不應顯示任何存檔結果。
您的模型可以有 2 個管理器:一個用於所有對象,一個用於排除對象
class SegmentStatuses:
STOPPED = 'stopped'
ACTIVE = 'active'
ARCHIVE = 'archive'
choices = ((STOPPED, STOPPED), (ACTIVE, ACTIVE), (ARCHIVE, ARCHIVE))
class UnArchivedManager(models.Manager):
def get_queryset(self):
return super(UnArchivedManager, self).get_queryset().exclude(status=SegmentStatuses.ARCHIVE)
class Segment(BaseSegmentModel):
payload_json = JSONField(null=True, default=None, blank=True)
owner = models.ForeignKey(CustomUser, null=True, blank=True, on_delete=models.SET_NULL, related_name='segments')
name = models.CharField(max_length=100, null=True, blank=False)
status = models.CharField(max_length=100, null=True, blank=True, choices=SegmentStatuses.choices, default=SegmentStatuses.STOPPED)
created_date = models.DateTimeField(null=True, auto_now_add=True)
objects = UnArchivedManager()
objects_all = models.Manager()
正如您在這張圖片中看到的那樣,我在 DB 中只有一個對象並且它具有“歸檔”狀態,所以當我使用“對象”管理器時,我沒有在結果中看到任何對象,但是當我使用“object_all”時' 經理我在結果中看到了 1 個對象
如果您根本不想訪問歸檔狀態,則可以忽略objects_all
管理器。
在視圖中,您可以使用exclude()
來做到這一點:
視圖.py:
Segment.objects.exclude(status='archive')
您可以覆蓋管理器的get_queryset
。
一個例子:
模型.py
class AnyManager(models.Manager):
def get_queryset(self):
qs = super().get_queryset()
return qs.exclude(status='archive')
class Segment(BaseSegmentModel):
payload_json = JSONField(null=True, default=None, blank=True)
owner = models.ForeignKey(CustomUser, null=True, blank=True, on_delete=models.SET_NULL, related_name='segments')
name = models.CharField(max_length=100, null=True, blank=False)
status = models.CharField(max_length=100, null=True, blank=True, choices=SegmentStatuses.choices, default=SegmentStatuses.STOPPED)
created_date = models.DateTimeField(null=True, auto_now_add=True)
objects = AnyManager()
它將排除具有status='archive'
的字段,因此您現在可以直接執行以下操作:
視圖.py:
Segment.objects.all()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.