![](/img/trans.png)
[英]How to copy a model instance to another model based on attribute value in Django
[英]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.