我正在尝试找出将带注释的字段(例如任何聚合的(计算的)字段)添加到DRF(模型)序列化器的最佳方法。我的用例仅是端点返回未存储在数据库中但从数据库计算出的字段的情况。
让我们看下面的例子:
models.py
class IceCreamCompany(models.Model):
name = models.CharField(primary_key = True, max_length = 255)
class IceCreamTruck(models.Model):
company = models.ForeignKey('IceCreamCompany', related_name='trucks')
capacity = models.IntegerField()
serializers.py
class IceCreamCompanySerializer(serializers.ModelSerializer):
class Meta:
model = IceCreamCompany
所需的JSON输出:
[
{
"name": "Pete's Ice Cream",
"total_trucks": 20,
"total_capacity": 4000
},
...
]
我有几个可行的解决方案,但是每个解决方案都有一些问题。
选项1:为模型添加吸气剂并使用SerializerMethodFields
models.py
class IceCreamCompany(models.Model):
name = models.CharField(primary_key=True, max_length=255)
def get_total_trucks(self):
return self.trucks.count()
def get_total_capacity(self):
return self.trucks.aggregate(Sum('capacity'))['capacity__sum']
serializers.py
class IceCreamCompanySerializer(serializers.ModelSerializer):
def get_total_trucks(self, obj):
return obj.get_total_trucks
def get_total_capacity(self, obj):
return obj.get_total_capacity
total_trucks = SerializerMethodField()
total_capacity = SerializerMethodField()
class Meta:
model = IceCreamCompany
fields = ('name', 'total_trucks', 'total_capacity')
上面的代码也许可以重构一点,但是它不会改变以下事实:该选项将对每个IceCreamCompany执行2个额外的SQL查询,这不是很有效。
选项2:在ViewSet.get_queryset中进行注释
最初描述的models.py。
views.py
class IceCreamCompanyViewSet(viewsets.ModelViewSet):
queryset = IceCreamCompany.objects.all()
serializer_class = IceCreamCompanySerializer
def get_queryset(self):
return IceCreamCompany.objects.annotate(
total_trucks = Count('trucks'),
total_capacity = Sum('trucks__capacity')
)
这将在单个SQL查询中获得聚合的字段,但是我不确定如何将它们添加到序列化程序中,因为DRF不可思议地知道我已经在QuerySet中注释了这些字段。如果将total_trucks和total_capacity添加到序列化程序中,它将引发有关模型中不存在这些字段的错误。
通过使用View可以使选项2在不使用序列化器的情况下工作,但是如果模型包含很多字段,并且JSON中仅要求包含某些字段,那么在没有序列化器的情况下构建端点将是一个有点丑陋的技巧。
可能的解决方案:
views.py
class IceCreamCompanyViewSet(viewsets.ModelViewSet):
queryset = IceCreamCompany.objects.all()
serializer_class = IceCreamCompanySerializer
def get_queryset(self):
return IceCreamCompany.objects.annotate(
total_trucks=Count('trucks'),
total_capacity=Sum('trucks__capacity')
)
serializers.py
class IceCreamCompanySerializer(serializers.ModelSerializer):
total_trucks = serializers.IntegerField()
total_capacity = serializers.IntegerField()
class Meta:
model = IceCreamCompany
fields = ('name', 'total_trucks', 'total_capacity')
我们希望序列化Java类的模式,以便任何字段或类上存在的所有注释也序列化到模式中。 我没有找到这样做的工具。 Avro不处理非字符串映射键,FasterXML不处理循环引用。它们都不会将注释序列化到模式中。 是否有任何Java JSON(反)序列化程序可以做到这一点?
例如: 我知道有jackson注解可以这样做,但是我的字段已经用我的持久性注解进行了注解,所以我想避免重复,因为我已经有了我想忽略的注解的字段
我给一个有json主体的aws lambda打电话。因此,json的字段与POJO中的字段具有不同的名称。所以我所做的就是在字段中添加@JsonProperty,告诉jackson json中的名称。但出于某种原因,它似乎无法识别它们,并且所有字段都为空。如果我传递一个与POJO具有相同字段名的json,它就会工作。这是我的课: 如果我通过 所有的字段都是空的,并且有明显的ID、userId、ev
考虑一个案例,我有2个对象映射器实例。我希望必须从序列化中排除使用某些自定义注释注释的字段,而其他映射器包含(忽略注释) 就像类有3个字段a,b,c和c用一些注释注释(比如@IgnoreField)(它们的n个类,每个类都有它们不应该被序列化的字段) 现在,第一个对象映射器 o1 必须仅序列化 a 和 b。而第二个对象映射器o2可以序列化a,b和c。 任何具有不同字段的类都可能发生这种情况,其中一
我有一个
本文向大家介绍C ++ 17中带有初始化程序的其他语句和Switch语句,包括了C ++ 17中带有初始化程序的其他语句和Switch语句的使用技巧和注意事项,需要的朋友参考一下 在许多情况下,我们需要验证函数返回的值,然后根据该值执行条件操作。所以我们的代码如下- 只需在所有条件if-else块中遵循通用格式即可。首先,存在一个可选的初始语句来设置变量,然后是if-else块。所以一般的if-e