如何基于另一个模型的实例在 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
我是 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