DRF:根据字段值动态选择Serializer类

时间:2017-05-08 22:13:29

标签: python django django-rest-framework

我正在一个应用程序中工作,我需要构建一个API来将产品目录返回给应用程序的客户端,这就是我的模型的外观。

class Category(models.Model):
    name = models.IntegerField(...)
    description = models.CharField(...)
    category_type = models.PositiveIntegerField(...)
    .  
    .  
    .  

class Product(models.Model):
    code = models.IntegerField(...)
    category = models.ForeignKey(Category, ..)
    .  
    # Common product fields
    .  

class ProductA(Product):
    product_a_field = models.IntegerField(..)
    .  
    .  
    .  

class ProductB(Product):
    product_b_field = models.IntegerField(...)
    .  
    .  
    .  

除了公共字段(继承自Product)之外,ProductA和ProductB两个模型彼此非常不同。 我想要做的是根据Category.category_type字段的值向客户发送一组不同的产品。

我想简化我的Category Serializer:

class CategorySerializer(serializers.ModelSerializer):
        .
    def __init__(self, *args, **kwargs):
        #
        # Some code to select the product Serializer
        #

    products = ProductSerializer()

    class Meta:
        model = Category
        fields = ('name', 'description', 'category_type', 'products')

有没有办法实现这个目标?我正在使用Python3,Django 1.10和DRF 3.6。

1 个答案:

答案 0 :(得分:3)

覆盖APIView中的get_serializer_class方法。

然后访问请求并在那里执行逻辑:

#taken directly from the docs for generic APIViews
def get_serializer_class(self):
    if self.request.user.is_staff:
        return FullAccountSerializer
    return BasicAccountSerializer

此外,您可以在基于班级的视图中访问category_type变量:

@property
def category_type(self):
    if not hasattr(self, '_category_tpye'):
        self._category_type = Category.objects.get(attribute=self.kwargs['attribute'])
    return self._category_type