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次,这对我来说是一个相当大的性能问题。
答案 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
时,让它使用自定义查询。