我有以下(简化)数据模型:
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})
但保持它们分开感觉更灵活.