在 django REST 框架的过滤获取请求中包含来自另一个引用模型的属性
Include attributes from another referenced model in a filtered get request on django REST framework
我的目标是在对产品发出获取请求时,包含 Brand
模型的 Product
属性 Product
引用。 returns在pythonshell:returns这段代码到底是什么
Product.objects.all().values('name', 'brand__name',)
returns这个:
[
{'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/reference(以及 [的所有其他属性) =18=]).
我解决了我自己的问题,通过在 ProductSerializer
中将 brand
定义为 brandSerializer
,我能够 return 整个品牌对象以及产品信息,就像这样:
class ProductSerializer(serializers.HyperlinkedModelSerializer):
brand = BrandSerializer()
class Meta:
model = Product
fields = ('id', 'url', 'sku', 'name', 'brand', 'price')
如果你想return作为一个平面字典,你可以这样做。
class ProductSerializer(serializers.HyperlinkedModelSerializer):
brand_name = serializer.CharField(source="brand__name")
class Meta:
model = Product
fields = ('id', 'url', 'sku', 'name', 'brand_name', 'price')
我的目标是在对产品发出获取请求时,包含 Brand
模型的 Product
属性 Product
引用。 returns在pythonshell:returns这段代码到底是什么
Product.objects.all().values('name', 'brand__name',)
returns这个:
[
{'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/reference(以及 [的所有其他属性) =18=]).
我解决了我自己的问题,通过在 ProductSerializer
中将 brand
定义为 brandSerializer
,我能够 return 整个品牌对象以及产品信息,就像这样:
class ProductSerializer(serializers.HyperlinkedModelSerializer):
brand = BrandSerializer()
class Meta:
model = Product
fields = ('id', 'url', 'sku', 'name', 'brand', 'price')
如果你想return作为一个平面字典,你可以这样做。
class ProductSerializer(serializers.HyperlinkedModelSerializer):
brand_name = serializer.CharField(source="brand__name")
class Meta:
model = Product
fields = ('id', 'url', 'sku', 'name', 'brand_name', 'price')