В настоящее время у меня настроена такая модель:
У меня есть класс Test
с внешним ключом к пользовательскому классу UserProfile
. Это свойство называется student
. Таким образом, каждый UserProfile мог занимать более одного Test
. Затем, в свою очередь, каждый UserProfile
связан с User
типичным отношением "один к одному". Добавляется еще один уровень сложности, потому что я объявил две группы пользователей tutors
и students
. И класс UserProfile
имеет отношение ManyToMany к самому себе, помеченному как "репетиторы". Логика такова, что у каждого ученика может быть много наставников. Теперь я хотел бы добавить фильтры в правой части страницы администратора теста, которые позволяют фильтровать по ученику и фильтровать по наставнику. настройка list_filter = ('student',)
просто перечисляет все доступные профили пользователей. Но это будет включать в себя UserProfiles, которые также привязаны к репетиторам. Очевидно, я хотел бы отфильтровать этот список только до студентов, потому что явная фильтрация любым из этих наставников приведет к пустому набору запросов. Затем я хотел бы сделать то же самое с фильтрацией по наставнику, где в этом случае сокращение будет list_filter = ('student__tutors')
, но я бы хотел, чтобы этот набор UserProfile был отфильтрован, чтобы включить только те, где user_ groups _name = 'репетиторы'. Как лучше всего это сделать?
Для наглядности моя объектная модель выглядит так:
class UserProfile(models.Model):
user = models.OneToOneField(User, unique=True,related_name='profile')
tutors = models.ManyToManyField("self",related_name="students")
class Test(models.Model):
student = models.ForeignKey(UserProfile,related_name='tests')
Я пробовал создать подкласс django.contrib.admin.SimpleListFilter
следующим образом:
class StudentListFilter(SimpleListFilter):
title = 'student'
parameter_name = 'student__id__exact'
def lookups(self, request, model_admin):
qs = model_admin.queryset(request)
return User.objects.filter(profile__id__in=qs.values_list('student__id')).extra(select={'full_name':'first_name||" "||last_name'}).values_list('profile__id','full_name')
def queryset(self, request, queryset):
if self.value() is not None:
return queryset.filter(student__id__exact=self.value())
else:
return queryset
Кажется, это работает для первого list_filter, но проблема в том, что по какой-то причине теперь есть ошибка, когда выбранный параметр не выделяется в настраиваемом фильтре. Подсвечиваются только «Все», но не настраиваемые параметры. Вот пример того, что опубликовал другой пользователь:
В настоящее время я использую разрабатываемую версию django 1.4, поэтому я не уверен, связана ли эта проблема с этим или нет.