我正在一个应用程序中工作,我需要构建一个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。
答案 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