我正在尝试获取嵌套对象但不太确定如何实现此目的。我的模型如下所示:
class Brand(models.Model)
name = models.CharField(max_length=128)
class Size(models.Model)
name = models.CharField(max_length=128)
class Brand_Size(models.Model)
brand = models.ForeignKey(Brand)
size = models.ForeignKey(Size)
class Brand_Size_Location(models.Model)
location = models.ForeignKey(Location)
brand_size = models.ForeignKey(Brand_Size)
我按照Brand_Size_Location
的位置过滤1..x
中的对象。我希望我的序列化程序根据模型Brand
(BrandSerializer)输出结果。由于我的结果集可以是1..x
,而Brand
的出现可能是重复的,我想同时消除这些。
答案 0 :(得分:1)
您可以通过在BrandSerializer中包含序列化程序字段来轻松地完成此操作:
class BrandSerializer(serializers.ModelSerializer):
brand_sizes = BrandSizeSerializer(
source='brand_size_set',
read_only=True
)
class Meta:
model = Brand
fields = (
'id',
...add more fields you want here
'brand_sizes')
您可以类似地创建品牌大小的序列化程序来嵌套位置
在视图中对此关系进行过滤,并且需要自定义过滤器。以下是使用ListView
:
class BrandFilter(django_filters.FilterSet):
location = django_filters.ModelMultipleChoiceFilter(
queryset=Brand_Size_Location.objects.all(),
name='brand_size__brand_size_location__location'
)
location_name = django_filters.CharFilter(
name='brand_size__brand_size_location__location__name'
)
class Meta:
model = Brand
fields = [
'location',
'location_name'
]
class BrandList(LoginRequiredMixin,generics.ListCreateAPIView): model =品牌 serializer_class = BrandSerializer filter_class = BrandFilter
然后,您可以使用查询参数来过滤URL,如:
http://somehost/api/brands/?location=42
使用PK过滤,或使用位置名称(假设您在Location模型中有名称字段):
http://somehost/api/brands/?location_name=Atlantis