Django Rest Framework - 过滤 ArrayField 包含 value1 或 value2 而不是子集的模型

标签 django django-models django-rest-framework django-filter django-filters

开门见山。

这是我的模型:

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)

序列化器:

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']

我的自定义过滤器:

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'],

        }

问题是,当我用红色、黑色、蓝色等颜色过滤它时,它只显示数组中具有这些值子集的对象,而不是我的目标之一。我找不到任何可行的查找表达式,如果有人想知道,尝试lookup_expr = color__in也不起作用。 就像在此字段中显示所有具有红色或黑色或蓝色值的鞋子。

请帮忙,我已经尝试了一切

最佳答案

overlap是您要查找的查找表达式。

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>]>

关于Django Rest Framework - 过滤 ArrayField 包含 value1 或 value2 而不是子集的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70696227/

相关文章:

Python虚拟环境包安装问题

python - Django 使用 crispy 表单用 css 渲染表单字段

django - 如何通过 TemplateView.as_view 重定向到 .html 文件

django - 在 Django Rest 框架中更新/修补/创建嵌套模型

apache - django Rest_framework 中缺少授权 header ,是 apache 的错吗?

ruby-on-rails - 启动服务器绑定(bind)到 0.0.0.0 和 127.0.0.1 有什么区别?

python - 为什么 prefetch_lated 在 django 中不起作用?

mysql - Django 重置不删除表

python - 如何在djangoviews.py中将一个类对象的id传递给另一个类对象

Django Rest框架批量创建