【问题标题】:How to filter based on another model in Django ModelViewSet?如何根据 Django ModelViewSet 中的另一个模型进行过滤?
【发布时间】:2021-09-20 21:16:23
【问题描述】:

我目前有一个使用ModelViewSetSiteViewSet,它可以从模型Site 列出、检索、创建和更新站点。

我想向同一个SiteViewSet 添加一个过滤器,该过滤器列出了is_active 为True 的所有站点对象 - 但此条件基于AdminConfiguration 模型。

我无法找到如何根据另一个模型的条件在ModelViewSet 中实现过滤器。过滤的端点/v1/site/?is_active=True 是否可以在同一个SiteViewSet 中实现,或者我应该创建一个单独的视图来通过更灵活的APIView 实现这一点?

SiteViewSet:

class SiteViewSet(viewsets.ModelViewSet):
    model = Site
    lookup_field = 'uuid'
    pagination_class = PageNumberPagination
    serializer_class = SiteSerializer
    queryset = Site.objects.all()

Site模特:

class Site(models.Model):
    uuid = models.UUIDField(
        default=uuid.uuid4,
        unique=True)
    domain_name = models.CharField(max_length=255, unique=True)

AdminConfiguration模特:

class AdminConfiguration(models.Model):
    site = models.OneToOneField(
        Site,
        on_delete=models.CASCADE)
    always_active = models.BooleanField(default=False)
    subscription_ends = models.DateTimeField(
        default=set_default_expiration)

    @property
    def is_active(self):
        active_status = self.always_active or self.subscription_ends > timezone.now()
        return active_status

【问题讨论】:

  • 这两个模型的链接是什么?它们是否通过字段链接?
  • @Rvector 2 个模型共享相同的主键(Site 模型的id

标签: django django-models django-rest-framework django-views


【解决方案1】:

在基于另一个模型的 DRF 过滤器中,与针对模型字段的过滤器相同。您可以通过像这样覆盖 get_queryset 方法来实现这一点:

我们假设你已经声明了你的 OneToOneField 像: site = models.OneToOneField(Site, on_delete=models.CASCADE, related_name='admin_config').

def get_queryset(self):
    queryset = Site.objects.filter(admin_config__is_active=True)

.filter(related_model_name__field=value)

注意:您的is_active 字段是一个属性!所以我从未使用模型的@property 字段进行测试。但它适用于标准字段。 如果您覆盖 get_queryset 方法,也不要忘记删除 queryset 属性。其中之一,而不是两者。

【讨论】:

  • 感谢您的提示!我能够让它工作
猜你喜欢
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 2015-12-23
  • 2021-01-26
相关资源
最近更新 更多