2

straight to the point.

This is my model:

class Product(models.Model):

brand = models.CharField(max_length=40)
model = models.CharField(max_length=40)
price = models.FloatField(default=0)

colors = ArrayField(models.CharField(max_length=20), blank=True, null=True, default=[])
sizes = ArrayField(models.IntegerField(), blank=True, null=True)

discount_price = models.FloatField(null=True, blank=True, default=list)
date_added = models.DateTimeField(auto_now_add=True)
desc = models.TextField(default=None, blank=True, null=True)
gender = models.CharField(choices=GENDER_CHOICES, blank=True, null=True, max_length=10)
for_kids = models.BooleanField(blank=True, null=True)

Serializer:

class ProductsSerializer(serializers.ModelSerializer):

pictures = ProductPicturesSerializer(many=True, read_only=True)
average_rating = serializers.SerializerMethodField()

def get_average_rating(self, obj):
    return obj.average_rating

class Meta:
    model = Product
    fields = ['id', 'brand', 'model', 'price', 'discount_price',
              'date_added', 'for_kids', 'gender',
              'average_rating', 'sizes', 'colors', 'pictures']

My custom filter:

class CharArrayFilter(filters.BaseCSVFilter, filters.CharFilter):
    pass


class ProductsFilter(filters.FilterSet):

    min_price = filters.NumberFilter(field_name="price", lookup_expr='gte')
    max_price = filters.NumberFilter(field_name="price", lookup_expr='lte')

    colors = CharArrayFilter(lookup_expr='contains')


    class Meta:
        model = Product
        fields = {
            'brand': ['in'],
            'model': ['in', 'exact'],

        }

The problem is, when Im filtering it with colors like: red,black,blue, it only displays objects which have subset of theese values in array, not one of them which is my goal. I cant find ANY lookup expression that would work,trying lookup_expr = colors__in also doesn't work if anyone is wondering. Like display all shoes which have value red OR black OR blue in this field.

Please help, I've tried everything

1 Answer 1

2

overlap is the lookup expression you are after.

Returns objects where the data shares any results with the values passed. Uses the SQL operator &&. For example:

>>> Post.objects.create(name='First post', tags=['thoughts', 'django'])
>>> Post.objects.create(name='Second post', tags=['thoughts'])
>>> Post.objects.create(name='Third post', tags=['tutorial', 'django'])

>>> Post.objects.filter(tags__overlap=['thoughts'])
<QuerySet [<Post: First post>, <Post: Second post>]>

>>> Post.objects.filter(tags__overlap=['thoughts', 'tutorial'])
<QuerySet [<Post: First post>, <Post: Second post>, <Post: Third post>]>
Sign up to request clarification or add additional context in comments.

1 Comment

Oh my god thank you so, so much sir.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.