簡體   English   中英

如何在 Django 查詢集上創建默認過濾器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM