如何基于另一个模型的实例在 Django 中创建模型,但已过滤

How to create a model in Django based on the instance of another model, but filtered

我是 Django 的新手,我正在寻找一种在 Django 中基于另一个模型的实例创建模型的方法,但已过滤。

我有一个名为 Person 的 table,它有名字和角色,在我的 models.py:

class Person(models.Model):

id = models.UUIDField(primary_key=True) 
name = models.CharField(max_length=100) 
role = models.CharField(max_length=100) 
created_on = models.DateTimeField(auto_now_add=True)

class Meta:
    db_table = 'person'

我想要的是能够在我的 admin.py 中调用一些子类,它将只显示演员 (role="actors"):

@admin.register(Actor)
class Actor(admin.ModelAdmin):...

可能吗?还是我只需要再创作一部 table 演员?

我知道我可以用list_filter = ('role',),但这不是我要找的,我只需要演员。

我认为解决方案是这样的:

class Actor(models.Model):
    objects = Person.objects.filter(role='actor')
    class Meta:
        verbose_name = 'actor'

class Actor(Person):
    self.objects.filter(role='actor')
    class Meta:
        verbose_name = 'actor'

这显然行不通。

您可以为此使用代理模型:

class ActorManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(role='actors')

class Actor(Person):
    objects = ActorManager()
    
    class Meta:
        proxy = True

代理模型只是继承模型(此处为 Person)的代理,即没有创建新的 table。在这里,我们创建了一个自定义管理器,以便始终过滤角色。现在只需将此模型注册到管理站点。参考资料:Proxy Models, Custom Managers