Это связано с другим моим вопросом, который, как мне казалось, я решил. Тем не менее, применив фильтр по школе, я получаю любой проект, в котором любой человек принадлежит этой школе. Вместо этого я хочу фильтровать только проекты с лицами, которые одновременно являются «Главным исследователем» (role) и принадлежат к определенной школе.
Сейчас приведенный ниже код выводит проект, на который связан любой человек, принадлежащий к отфильтрованной школе, независимо от его роли.) p>
Мои модели.py:
class School(models.Model):
name = models.CharField(max_length=200)
class Person(models.Model):
surname = models.CharField(max_length=100, blank=True, null=True)
forename = models.CharField(max_length=100, blank=True, null=True)
school = models.ForeignKey(School, null=True, blank=True, on_delete=models.CASCADE)
class PersonRole(models.Model):
ROLE_CHOICES = [
("Principal investigator", "Principal investigator"),
[...]
]
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)
class Project(models.Model):
title = models.CharField(max_length=200)
person = models.ManyToManyField(Person, through=PersonRole)
Мой admin.py:
class PISchoolFilter(admin.SimpleListFilter):
title = 'PI School'
parameter_name = 'school'
def lookups(self, request, model_admin):
return (
('Arts & Humanities Admin',('Arts & Humanities Admin')),
[...]
)
def queryset(self, request, queryset):
if self.value() == 'Arts & Humanities Admin':
return queryset.filter(
person__personrole__person_role__contains="Principal investigator",
person__personrole__person__school=5 #5 is 'Arts & Humanities Admin' school pk.
).distinct()
[...]
def choices(self, changelist):
super().choices(changelist)
return (
*self.lookup_choices,
)
class ProjectAdmin(NumericFilterModelAdmin, ImportExportModelAdmin):
list_filter = [PI_SchoolFilter]
Почему (person__personrole__person_role__contains="Главный исследователь", person__personrole__person__school=5) не работает с тем же экземпляром PersonRole? Я также пробовал использовать Q(person__personrole__person_role__contains="Главный исследователь") и Q(person__personrole__person__school=4).distinct() и получил то же самое, то есть проект, в котором был либо один человек с этой ролью, либо с этой школой. . Я хочу, чтобы и то и другое было указано на одного и того же человека, или ничего.
PS:
Я заметил, что когда я фильтрую по школе (т. е. выбираю school из раскрывающегося списка фильтров администратора) адрес загруженной страницы содержит только ?person__personrole__person__school=5, роль вообще игнорируется. Если я жестко запрограммирую ?person__personrole__person_role__contains="Главный исследователь", я получу
DisallowedModelAdminLookup at /admin/artsdb/project/
Filtering by person__personrole__person_role__contains not allowed
Подробнее здесь: https://stackoverflow.com/questions/783 ... ame-record