Как создать SimpleListFilter в django
У меня есть следующие модели: Пациент, Рецепт и Пользователь, которые делают отношения между первыми двумя моделями.
class Patient(models.Model):
user = models.OneToOneField(
settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
address = models.TextField(blank=True, null=True)
city = models.CharField(max_length=85, null=True, blank=True)
country = CountryField(null=True, blank=True)
postal_code = models.CharField(max_length=32, null=True, blank=True)
[and other stuff]
class Prescription(models.Model):
user = models.ForeignKey(
User,
null=True,
blank=False,
on_delete=models.DO_NOTHING
)
uploaded_by_user = models.IntegerField(
'upload user from request.user',
null=True,
)
prescription_date = models.DateTimeField(
null=True,
blank=True,
)
image_file = models.BinaryField(
'prescription file',
blank=True,
null=True,
)
file_extention = models.CharField(
'file extention',
max_length=8,
null=True,
blank=True,
)
В PatientAdmin я хочу использовать фильтр по файлу рецепта (например, pdf или jpg). Я создал SimpleListFilter, но у меня все та же проблема.
Объект "Рецепт" не является подписываемым
Вот код моего SimpleListFilter
class PrescriptionFileExtensionFilter(SimpleListFilter):
"""
This filter is being used in django admin panel in patient model.
"""
title = 'Prescription File Ext'
parameter_name = 'file_extention'
def lookups(self, request, model_admin):
return (
('pdf', 'PDF'),
('jpg', 'JPG'),
)
def queryset(self, request, queryset):
print(queryset)
for user in queryset:
mydict = user.user.prescription_set.all().first()
print(mydict['file_extention'])
if self.value() == 'pdf':
return queryset.filter(
user=user.user).filter(prescription__file_extention="pdf")
if self.value() == 'jpg':
return queryset.filter(
user=user.user).filter(prescription__file_extention="jpg")
Вы пытаетесь получить ключ от объекта рецепта в print(mydict['file_extention'])
, что, как я полагаю, и вызывает проблему - вместо этого вы должны получить доступ к этому свойству через mydict.file_extention
- хотя я должен добавить, что mydict не является точным именем переменной для объекта модели, поскольку это не словарь. Я не думаю, что цикл for на самом деле делает что-то, кроме печати определенного значения, поэтому его можно вообще убрать.
Кстати, у вас два фильтра в наборе запросов, это можно выразить как один фильтр, разделив его запятой, например
return queryset.filter(user=user.user, prescription__file_extention="pdf")
Вы также вызываете user.user
, предположительно вы просто хотите получить модель пользователя, которая хранится в request.user
- это то, что пытался сделать ваш цикл for?