Meta.fields содержит поле, не определенное в этом FilterSet: ****

Я использую пакет фильтров Django.

Я определяю свой фильтр следующим образом в представлении

class UnitFilter(django_filters.FilterSet):
    class Meta:
        model = Unit
        fields = [
            'floor', 'number', 'building','lease','leaseterm', 
            'lease__is_active','lease__is_terminated','lease__is_renewed',]

Моя модель устройства, по которой я фильтрую, следующая

class Unit(CommonInfo):
    version = IntegerVersionField( )
    number = models.CharField(max_length=30,null=True, blank=True)
    max_occupants = models.PositiveSmallIntegerField()
    floor = models.PositiveSmallIntegerField()
    rooms = models.PositiveSmallIntegerField()
    is_disabled_access = models.BooleanField(default=False)
    balcony_quantity = models.PositiveSmallIntegerField()
    building = models.ForeignKey(Building)
    recomended_price = models.DecimalField(max_digits=7, decimal_places=2)
    _lease = None
    _leaseterm = None
    #check = models.ManyToManyField(UnitCheck, through='UnitChecklist')

    def _get_total(self):

        from conditions.models import LeaseTerm
        from lease.models import Lease

        lease_dict = Lease.objects.filter(unit_id=self.id, is_active = True , is_terminated = False).aggregate(Max('id'))
        if lease_dict['id__max']:
            lease =  lease_dict['id__max'] 
        else:  
            lease =  0

        leaseterm_dict = LeaseTerm.objects.filter(lease_id=lease, is_active = True , is_terminated = False).aggregate(Max('id'))
        if leaseterm_dict['id__max']:
            leaseterm =  leaseterm_dict['id__max'] 
        else:  
            leaseterm =  0

        self._lease = lease
        self._leaseterm = leaseterm

    @property
    def lease(self):
        if self._lease is None:
            self._get_total()
        return self._lease

    @property
    def leaseterm(self):
        if self._leaseterm is None:
            self._get_total()
        return self._leaseterm

В этой модели есть 2 расчетных свойства: аренда и срок аренды.

у арендованного имущества нет проблем, когда договор аренды выдает мне эту ошибку

Meta.fields содержит поле, которое не определено в этом FilterSet: срок аренды.

Почему? это ошибка в django-filter? Любая работа?


person Ilya Bibik    schedule 16.10.2016    source источник


Ответы (1)


См. это для хорошего объяснения.

Когда вы делаете queryset.filter(field_name=field_value), Django переводит это в SQL-запрос. К сожалению, вычисляемые свойства существуют только в объекте Python, поэтому фильтровать по ним нельзя.

Обходной путь заключается в том, чтобы всякий раз, когда вы фильтруете по одному из них, включать аннотацию в ваш набор запросов, которая добавляет правильное поле в SQL. По ссылке есть хороший пример того, как это сделать. Это сложнее, чем сделать это на Python, но на самом деле это единственный способ.

person Sam Bobel    schedule 30.10.2017