【问题标题】:Custom filtering and grouping in Django Rest FrameworkDjango Rest Framework 中的自定义过滤和分组
【发布时间】:2020-07-08 06:29:41
【问题描述】:

我正在开发允许用户在特定模型上创建自定义过滤器并将这些结果存储为一个组的功能。作为一个工作示例(为简洁起见,省略了导入):

class Client(models.Model):
    email = CIEmailField()

class Activity(models.Model):
    client = BaseForeignKey("client.Client", null=True, related_name="logged_activities")
    employee = BaseForeignKey("business.Employee", null=True, related_name="logged_activities")
    created = models.DateTimeField(auto_now_add=True)

我们想要创建过滤器,它将根据创建时间和关联的EmployeeClients 分组到Activitys 上,并将这些结果存储在一个组中以供以后使用。这是一个非常简单的任务,除了允许用户修改过滤器配置和更新Client 上的字段,这两者都可能改变Client 是否匹配过滤器标准。 (注意:在本例中,更新 Client 是不可能的,可能会改变结果集,但未来的过滤器会。)

我想要多对多,这样我们就可以轻松地获取客户所在的组,反之,也可以让客户进入一个组,但我不清楚处理过滤器配置的最佳方式。我们的系统目前支持此功能,但过滤器无法正常工作,并且每当需要使用有关组的信息时都会运行过滤器查询。鉴于此以及其他一些因素,我们决定重建此功能,而不是尝试重构当前的实现。

【问题讨论】:

    标签: python django postgresql django-models django-rest-framework


    【解决方案1】:

    一种粗略的处理方式如下。您创建一个映射或钩子,其键将匹配多对多字段上的中间模型上的字段。然后为映射/挂钩中的每个过滤器注册(添加键/值)。您使用适当的键创建中间模型的实例。然后,当您需要使用特定组的功能时,您将模型实例从数据库中拉出,并使用密钥从映射/挂钩中找到特定的过滤器功能。

    config_groups = {}
    
    class BaseConfig:
        key = None # Must be overridden by subclasses
        # I assume each of your filters has some common interface.
        # Put that here and raise NotImplemented exceptions for each function.
    
    class AFilterConfig(BaseConfig):
        key = 'a_filter'
        # Implement AFilter's specific filtering logic.
    
    config_groups[AFilterConfig.key] = AFilterConfig
    
    class ConfigGroup(models.Model):
        # Relationship fields to Client and/or Activity
        key = models.CharField(max_length=16, unique=True, choices=list(config_groups.keys()))
    
    
    def view_function(request):
        config_group = ConfigGroup.objects.get()
        filter_config = config_groups[config_group.key]
    

    如果您想更进一步,可以考虑将此映射/挂钩设置为实际的 Django 模型字段。这样您就可以执行以下操作,而无需处理映射/挂钩的导入和索引。

    def view_function(request):
        config_group = ConfigGroup.objects.get()
        filter_config = config_groups.filter_config
    

    【讨论】:

      猜你喜欢
      • 2018-12-23
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 1970-01-01
      • 2018-10-26
      • 2013-05-21
      • 1970-01-01
      相关资源
      最近更新 更多