Как создать 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?

Вернуться на верх