【问题标题】:Django model inheritance with proxy classesDjango 模型继承与代理类
【发布时间】:2022-06-24 17:49:09
【问题描述】:

我已经创建了代理类,主要是为了实现自定义过滤,但也有一些其他相当小的自定义方法,它们将被扩展以提供其他自定义逻辑。

假设我有模型:

class Videos(models.Model):
    title = models.CharField(max_length=200)
    publisher = models.Charfield(max_length=100)
    release_date = models.DateField()

class Superheroes(Videos):
    objects = SuperheroesManager()

    class Meta:
        proxy = True

class Recent(Videos):
    objects = RecentManager()

    class Meta:
        proxy = True

和模型经理:

class SuperheroesManager():
    def get_queryset(self):
        return super().get_queryset().filter(publisher__in=['Marvel','DC'])

class RecentManager():
    def get_queryset(self):
        return super().get_queryset().filter(release_date__gte='2020-01-01')

在前端,用户可以选择对应于其中一个代理类的类别。维护传递给视图的类别与关联的代理类之间的映射的最佳方法是什么?

目前我有一个隐式依赖,即前端提供的类别名称必须与代理类名称相同,从而允许视图中的标准接口:

def index(request, report_picked)
    category = getattr(sys.modules[__name__], report_picked)
    videos = category.objects.all()

我想摆脱这种隐式依赖,但不确定最好的方法是什么。

我不想维护字典,也不能使用工厂方法,因为它应该返回完全初始化的对象,而我只需要返回类。

实现这一点的最佳方法是什么?

【问题讨论】:

    标签: python django


    【解决方案1】:

    我决定将前端使用的类别名称设置为类变量:

    class Superheroes(Videos):
        category = 'superheroes'
        objects = SuperheroesManager()
    
        class Meta:
            proxy = True
    

    所以视图只是循环遍历所有模型,并返回类别与前端提供的值匹配的模型:

    from django.apps import apps
    
    def index(request, report_picked):
        for model in apps.get_models():
            try:
                print(f"Report picked: {report_picked}, model: {model.name}")
                if model.category == report_picked.lower():
                    category = model
                    break
            except AttributeError:
                pass
    

    我很想知道是否有更好的选择。

    【讨论】:

      猜你喜欢
      • 2013-09-10
      • 2013-04-08
      • 2015-03-05
      • 2013-04-20
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多