如何在DjangoREST Serializer

时间:2017-08-16 06:45:15

标签: python django

car/models.py

class CarData(AbstractSoftModelController, AbstractDataType):
    ...
    license_plate = models.OneToOneField(LicensePlate,
                                         related_name='car_data',
                                         verbose_name=_('License plate'))
    ...

license/models.py

class LicensePlate(AbstractSoftModelController, AbstractDataType):
    hiragana_prefix = models.CharField(
    max_length=50, db_index=True, verbose_name=_('Hiragana prefix'), null=True, blank=True
)
    vehicle_class_number = models.CharField(
    max_length=100, db_index=True, verbose_name=_('Vehicle class number'), null=True, blank=True
)
    regional_code = models.CharField(
    max_length=50, db_index=True, verbose_name=_('Regional code'), null=True, blank=True
)

serializers.py

class MailLogOrderCarSerializer(serializers.ModelSerializer):
    hiragana_prefix = serializers.SerializerMethodField()
    vehicle_class_number = serializers.SerializerMethodField()
    regional_code = serializers.SerializerMethodField()

    class Meta:
        model = CarData
        fields = ('brand', 'model', 'license_plate')

    def get_hiragana_prefix(self, obj: CarData):
        return obj.license_plate.hiragana_prefix

    def get_vehicle_class_number(self, obj: CarData):
        return obj.license_plate.vehicle_class_number

    def get_regional_code(self, obj: CarData):
        return obj.license_plate.regional_code

问题
如何优化序列化程序?
单个实例命中数据库3次并不好。
假设我查询500辆汽车。
然后它将达到1500次,这对我来说是一个相当大的性能问题。

2 个答案:

答案 0 :(得分:2)

优化序列化代码

class MailLogOrderCarSerializer(serializers.ModelSerializer):
    hiragana_prefix = serializers.ReadOnlyField(source='license_plate.hiragana_prefix')
    vehicle_class_number = serializers.ReadOnlyField(source='license_plate.vehicle_class_number')
    regional_code = serializers.ReadOnlyField(source='license_plate.regional_code')

不确定数据库查询,但你可以测试它

答案 1 :(得分:1)

此问题的解决方案是将.select_related('license_plate')添加到queryset 然后当view调用serializer时,让它使用自定义查询。