使用Django REST框架获取嵌套对象

时间:2014-04-19 15:40:53

标签: django django-rest-framework

我正在尝试获取嵌套对象但不太确定如何实现此目的。我的模型如下所示:

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的出现可能是重复的,我想同时消除这些。

1 个答案:

答案 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