Search code examples
djangodjango-filter

Error filtering a ForeignKey with UUID as pk


I'm using django-filters to filter data and display it in a table. One of the values is a ForeignKey that has as pk an UUID. When I use lookup_expr='icontains' then I get the following error:

"Related Field got invalid lookup: icontains"

How can I use lookup_expr='icontains' for a ForeignKey with a UUID pk?

Thank you in advance.

models:

class Data(models.Model):

    data_id = models.UUIDField(primary_key=True, default=uuid.uuid4)
    data_device_id = models.ForeignKey(Device, models.SET_NULL, blank=True, null=True)


class Device(models.Model):
    device_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=True)
    device_name = models.CharField(max_length=64)

Filter:

class DataFilter(django_filters.FilterSet):

    data_id = django_filters.CharFilter(label='Data id', lookup_expr='icontains')
    data_device_id = django_filters.CharFilter(label='Device id', lookup_expr='icontains') #ERROR HERE 

    class Meta:
        model = Data
        fields = {'data_id','data_device_id'}

Solution

  • You should specify that the __icontains works on the primary key, so:

    class DataFilter(django_filters.FilterSet):
    
        data_id = django_filters.CharFilter(label='Data id', lookup_expr='icontains')
        data_device_id = django_filters.CharFilter(
            label='Device id',
            lookup_expr='icontains',
            #                           ↓ apply the lookup on the primary key
            field_name='data_device_id__pk'
        )
    
        class Meta:
            model = Data
            fields = {'data_id','data_device_id'}