Search code examples
djangotastypie

How to make filtering in tastypie on virtual django model field (property)?


I have the next django model where tracker_id is a virtual field:

class Failures(models.Model):
    _tracker_id = models.CharField('Tracker ID', max_length=50) 

    def __set_tracker_id(self, value):
        self._tracker_id = value

    def __get_tracker_id(self):
        issue = self.do_something(self._tracker_id)
        return issue

    tracker_id = property(__get_tracker_id, __set_tracker_id)

Also I have tastypie resource on it:

class FailuresResource(BasicResource):
    tracker_id = fields.CharField(attribute='tracker_id')

    class Meta:
        queryset = Failures.objects.all()
        allowed_methods = ['get', 'post', 'put']

        filtering = {
            'tracker_id': ALL,
        }
        excludes = ('_tracker_id', )

BUT! When I try to filter objects by tracker_id like this way

http://myhost/api/v1/failures/?tracker_id=123

I am getting error: "Cannot resolve keyword 'tracker_id' into field. Choices are: _tracker_id"

Is there anyway to make filtering by tracker_id instead internal field???

Thank you!


Solution

  • Filtering via Meta class is only available for real field.

    Try to override build_filters function

    def build_filters(self, filters=None):
        if filters is None:
            filters = {}
    
        orm_filters = super(FailuresResource, self).build_filters(filters)
    
        if 'tracker_id' in filters:
            # do your trick here
            orm_filters['_tracker_id'] = filters['tracker_id']
    
        return orm_filters
    

    Don't forget to remove not-working filterings in your Meta class.