在django REST框架上的过滤后的get请求中包括来自另一个引用模型的属性

时间:2019-04-05 14:38:03

标签: django django-models django-rest-framework django-views django-filter

我的目标是在提出产品索取请求时,将name引用的Brand模型的Product属性包括到models.ForeignKey中。正是这段代码在python shell中返回的内容:

Product.objects.all().values('name', 'brand__name',)

返回此:

[
    {'name': 'B-1', 'brand__name': 'B-brand'}, 
    {'name': 'B-2', 'brand__name': 'B-brand'}, 
    {'name': 'C-1', 'brand__name': 'C-brand'}
]

我已经使用django-filters来过滤我的获取请求。

型号:

class Brand(models.Model):
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name


class Product(models.Model):
    name = models.CharField(max_length=255)
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE, default=None)

    def __str__(self):
        return self.name

序列化器:

class BrandSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Brand
        fields = ('id', 'url', 'name')


class ProductSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Product
        fields = ('id', 'url', 'name', 'brand')

过滤器:

class ProductFilter(filters.FilterSet):
    name = filters.CharFilter(lookup_expr = 'icontains')
    brand__name = filters.CharFilter(lookup_expr = 'icontains')

    class Meta: 
        model = Product
        fields = ('name' 'brand__name',)

查看:

class ProductView(viewsets.ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    filterset_class = ProductFilter

在filterSet中使用brand__name,我可以引用某个产品正在引用的品牌模型的名称并进行检索。我的目标是在制作get request时还包括该品牌的名称以及产品的属性,该名称目前仅产生该品牌的url /引用(以及{{1的所有其他属性}}。

2 个答案:

答案 0 :(得分:0)

我已经解决了自己的问题,通过在brand中将brandSerializer定义为ProductSerializer,我可以返回整个品牌对象以及产品信息,如下所示:

class ProductSerializer(serializers.HyperlinkedModelSerializer):
    brand = BrandSerializer()
    class Meta:
        model = Product
        fields = ('id', 'url', 'sku', 'name', 'brand', 'price')

答案 1 :(得分:0)

如果您想以平面词典的形式返回,可以这样做。

class ProductSerializer(serializers.HyperlinkedModelSerializer):
    brand_name = serializer.CharField(source="brand__name")
    class Meta:
        model = Product
        fields = ('id', 'url', 'sku', 'name', 'brand_name', 'price')