Фильтрация в администраторе Django для нескольких условий в одной записиPython

Программы на Python
Anonymous
Фильтрация в администраторе Django для нескольких условий в одной записи

Сообщение Anonymous »

Это связано с другим моим вопросом, который, как мне казалось, я решил. Тем не менее, применив фильтр по школе, я получаю любой проект, в котором любой человек принадлежит этой школе. Вместо этого я хочу фильтровать только проекты с лицами, которые одновременно являются «Главным исследователем» (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

Вернуться в «Python»