繁体   English   中英

如何基于另一个 model 的实例在 Django 中创建 model,但经过过滤

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

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

在我的 models.py 中有一个名为 Person 的表,它具有名称和角色:

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):...

可能吗? 还是我必须只用演员再创建一张桌子?

我知道我可以使用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'

这显然是行不通的。

您可以为此使用代理 model:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM