【问题标题】:filter by is_active boolean field in django按 django 中的 is_active 布尔字段过滤
【发布时间】:2017-07-05 10:59:55
【问题描述】:

我想为我的应用程序中的所有模型创建一个is_active 字段,并且每当我创建 api 时,我只想过滤活动的模型并发送响应。有没有通用的方法来做到这一点?到目前为止,我保留了一个 boolean 字段 is_active 并且每次检索对象时,我都在编写一个过滤器。下面是代码:

我的models.py

class Crew(models.Model):
    crew_id = models.AutoField(primary_key=True)
    crew_code = models.CharField(max_length=200, null=False, unique=True)
    crew_name = models.CharField(max_length=200, null=False)
    crew_password = models.CharField(max_length=200, null=False)
    is_active = models.BooleanField(default=True)

我的views.py

@api_view(['GET'])
def get_crews(request):
    c = Crew.objects.filter(is_active=True)
    serializer = CrewSerializer(c, many=True)
    return Response(serializer.data, status=status.HTTP_200_OK)

【问题讨论】:

  • 这个方法有什么问题?

标签: python django filter


【解决方案1】:

你可以写custom model manager:

class IsActiveManager(models.Manager):
    def get_queryset(self):
        return super(IsActiveManager, self).get_queryset().filter(is_active=True)

class Crew(models.Model):
    ...
    objects = IsActiveManager()

现在Crew.objects.all() 将只返回 is_active 记录。

【讨论】:

  • 谢谢。这就是我想要的。但这也会删除管理列表中的所有非活动对象/条目。我需要在管理列表中显示所有对象。但只在 api 中过滤。
  • @SahanaPrabhakar 欢迎您!您可以为模型设置两个管理器。 objects = models.Manager() active_objects = IsActiveManager() 因此,当您只需要活动记录时,您可以使用 Crew.active_objects.all()
【解决方案2】:

你可以像这样在 mixin.py 文件中写一个 mixin

class TimeFieldsMixin(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    active = models.BooleanField(default=True, db_index=True)
    class Meta:
        abstract = True

然后像这样在你的模型中导入这个:

class User(TimeFieldsMixin):
     // model fields

默认情况下,无论您在何处使用此 mixin,都会添加此字段。

如果不清楚,请告诉我。

【讨论】:

  • 我确实明白这一点。我的问题实际上是只过滤活动字段。但这会节省我很多时间。我不必为每个模型写is_active 字段。谢谢。
  • 嗯,我理解不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 2022-10-05
相关资源
最近更新 更多