这是我的模型.py:

class Person(models.Model):

    surname = models.CharField(max_length=100, blank=True, null=True)
    forename = models.CharField(max_length=100, blank=True, null=True)

    def __str__(self):
        return '{}, {}'.format(self.surname, self.forename)

class PersonRole(models.Model):
    ROLE_CHOICES = [
        ("Principal investigator", "Principal investigator"),
        [etc...]
    ]
    title = models.CharField(choices=TITLE_CHOICES, max_length=9)
    project = models.ForeignKey('Project', on_delete=models.CASCADE)
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    person_role = models.CharField(choices=ROLE_CHOICES, max_length=30)

    def __str__(self):
        return '{}: {} as {}.'.format(self.project, self.person, self.person_role)

class Project(models.Model):

    title = models.CharField(max_length=200)
    person = models.ManyToManyField(Person, through=PersonRole)

    def __str__(self):
        return self.title

    def get_PI(self, obj):
        return [p.person for p in self.person.all()] #I'll then need to filter where person_role is 'Principal investigator', which should be the easy bit.

在我的管理后台,我想显示的人(主要调查员)在主表:

class ProjectAdmin(ImportExportModelAdmin):

    list_filter = [PersonFilter, FunderFilter]
    list_display = ("title", "get_PI")
    ordering = ('title',)

我想要:在管理员的项目表中显示具有‘首席调查员’角色的人.

你可以看到我在我的models.py中创建了我的get_PI(),在我的list_display中创建了引用.我得到Project.get_PI() missing 1 required positional argument: 'obj'.我做错了什么?

推荐答案

删除obj参数:

class Project(models.Model):
    title = models.CharField(max_length=200)
    person = models.ManyToManyField(Person, through=PersonRole)

    def __str__(self):
        return self.title

    def get_PI(self):  # 🖘 no obj
        return [p.person for p in self.person.all()]

然而,这将引入一个N+1 problem,因此您可能应该提高效率:

class ProjectAdmin(ImportExportModelAdmin):
    list_filter = [PersonFilter, FunderFilter]
    list_display = ('title', 'get_PI')
    ordering = ('title',)

    def get_queryset(self, request):
        return super().get_queryset(request).prefetch_related('person')

作为过滤,您可以使用用途:

class Project(models.Model):
    def get_PI(self):
        return [
            p
            for p in self.person.filter(
                personrole__title__contains='Principal investigator'
            )
        ]

然而,这将再次降低查询速度,因为现在我们再次执行一个查询per条记录.

Python相关问答推荐

TARete错误:类型对象任务没有属性模型'

什么相当于pytorch中的numpy累积ufunc

pandas滚动和窗口中有效观察的最大数量

我们可以为Flask模型中的id字段主键设置默认uuid吗

Pandas—在数据透视表中占总数的百分比

无法连接到Keycloat服务器

与命令行相比,相同的Python代码在Companyter Notebook中运行速度慢20倍

Geopandas未返回正确的缓冲区(单位:米)

干燥化与列姆化的比较

Gunicorn无法启动Flask应用,因为无法将应用解析为属性名或函数调用.'"'' "

为什么我的sundaram筛这么低效

不允许 Select 北极滚动?

如何从比较函数生成ngroup?

ModuleNotFoundError:Python中没有名为google的模块''

用来自另一个数据框的列特定标量划分Polars数据框中的每一列,

Regex用于匹配Python中逗号分隔的AWS区域

Polars时间戳同步延迟计算

如果服务器设置为不侦听创建,则QWebSocket客户端不连接到QWebSocketServer;如果服务器稍后开始侦听,则不连接

在MongoDB文档中仅返回数组字段

如何在Python中画一个只能在对角线内裁剪的圆?