Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何基于另一个模型的实例在Django中创建一个模型,但已过滤_Python_Django_Django Models_Django Admin - Fatal编程技术网

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

Python 如何基于另一个模型的实例在Django中创建一个模型,但已过滤,python,django,django-models,django-admin,Python,Django,Django Models,Django Admin,我是Django新手,我正在寻找一种方法,根据另一个模型的实例在Django中创建一个模型,但经过筛选 我在my 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) create

我是Django新手,我正在寻找一种方法,根据另一个模型的实例在Django中创建一个模型,但经过筛选

我在my 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中调用某个子类,该子类将只显示actors(role=“actors”):

可能吗?或者我必须只与演员再创建一张表吗

我知道我可以使用
list\u filter=('role',)
,但这不是我要搜索的,我只需要演员

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

class Actor(models.Model):
    objects = Person.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)的代理,即不创建新表。在这里,我们创建了一个自定义管理器,以便始终筛选角色。现在只需将此模型注册到管理站点。参考资料:,

酷!那很有效,非常感谢!如果我只使用
actors=models.ManyToManyField('Actor',through=FilmWorkPerson)
我会得到一个错误(没有外键)。如果你愿意,我可以再问一个问题,你可以回答:)不要给这个模型做一个
外键
,给
人做一个
外键
,但它会显示所有人,而不仅仅是actors@MStikh看看这个问题。这可能对你有帮助。
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