python – Django过滤子对象的值

我有以下(简化)数据模型:

class Article(Model):
    uuid = models.CharField(primary_key=True, max_length=128)

class Attribute(Model):
    uuid = models.CharField(primary_key=True, max_length=128)
    article = models.ForeignKey(Article, related_name='attributes')
    type = models.CharField(max_length=256)
    value = models.CharField(max_length=256)

一个示例用法是附加了属性的文章,其中type =“brand”和value =“Nike”.现在我想编写一个API,它可以获得具有特定品牌的所有文章,但我似乎无法为其编写过滤器.这是我到目前为止:

class PhotobookFilter(df.FilterSet):
    brand = df.CharFilter(method='filter_brand')

    class Meta:
        model = Article

    def filter_brand(self, queryset, name, value):
        return queryset.filter('order__attributes')

class PhotobookViewSet(AbstractOrderWriterViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticlePhotobookSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filter_class = PhotobookFilter

queryset.filter的行显然还不正确.我需要在这里创建一个过滤器,它返回包含type =“brand”和value = value属性的所有文章.我该怎么做?

最佳答案 您确定要将两个查找(属性的类型和值)压缩到一个过滤器中吗?为什么不分别对这两个字段进行过滤?

例如.

class PhotobookFilter(df.FilterSet):
    type = df.CharFilter(method='filter_type')
    value = df.CharFilter(method='filter_value')

    class Meta:
        model = Article

    def filter_type(self, queryset, name, value):
        return queryset.filter(**{'attributes__type': value}) 

    def filter_value(self, queryset, name, value):
        return queryset.filter(**{'attributes__value': value}) 

而现在像?type = brand& value = Nike这样的查询应该可行.

显然你可以将这两个条件压缩成一个过滤器,例如硬编码带部分:

class PhotobookFilter(df.FilterSet):
    brand = df.CharFilter(method='filter_brand')

    def filter_brand(self, queryset, name, value):
        return queryset.filter(**{'attributes__type': 'brand', 'attributes__value': value}) 

但保持它们分开感觉更灵活.

点赞