【问题标题】:How to create a model in Django based on the instance of another model, but filtered如何在 Django 中基于另一个模型的实例创建模型,但经过过滤
【发布时间】:2021-01-22 17:13:54
【问题描述】:

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

我的 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'

这显然行不通。

【问题讨论】:

    标签: python django django-models django-admin


    【解决方案1】:

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

    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)的代理,即不会创建新表。在这里,我们创建了一个自定义管理器,以便始终过滤角色。现在只需将此模型注册到管理站点。参考文献:Proxy Models、Custom Managers

    【讨论】:

    • 我知道需要了解如何将此模型用作另一个模型中的字段,该模型通过中间表连接到原始Person,如果我只使用actors = models.ManyToManyField('Actor', through=FilmWorkPerson)我得到一个错误(没有的外键)。如果你愿意,我可以再提出一个单独的问题,你可以回答:)
    • 不要给这个模型写ForeignKey,给ForeignKey写Person
    • 但它会显示所有人,而不仅仅是演员
    • @MStikh 看看这个问题filter foreignkey field in django admin。它可能会帮助你。
    • 现在当我尝试向演员添加新条目时,管理面板不允许我这样做:这部电影的电影工作人员已经存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 2023-03-23
    • 2023-02-11
    • 1970-01-01
    • 2021-05-31
    • 2020-01-02
    • 2023-03-17
    相关资源
    最近更新 更多