gpt4 book ai didi

python - DRF : Dynamically select Serializer class based on field value

转载 作者:行者123 更新时间:2023-11-30 22:37:33 25 4
gpt4 key购买 nike

我正在开发一个应用程序,需要构建一个 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(...)
.
.
.

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

我想将我的类别序列化器简化为:

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。

最佳答案

覆盖get_serializer_class APIView 中的方法。

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

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

此外,您还可以在基于类的 View 中像这样访问 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

关于python - DRF : Dynamically select Serializer class based on field value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43858066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com