class Wall(BaseComponent):
studs_material = models.CharField(max_length=255, null=True, blank=True)
studs_spacing = models.FloatField(null=True, blank=True)
studs_size = models.CharField(max_length=255, null=True, blank=True)
我有一个模型,必须表示不同来源的扁平数据。为了验证来自这个源的数据,我使用DRF序列化程序。
我面临的问题是如何在representation
方法中将3个字段优雅地组合成一个字段。你知道吗
我收到的数据格式如下:
{
`studs`: 'Steel, 2x4, 16'
}
我使用模型序列化程序并使用source='*'
填充数据
class FoundationWallSerializer(serializers.ModelSerializer):
studs = StudTypeSerializer(source='*', required=False)
class Meta:
model = Wall
fields = ('studs',)
在子序列化程序中,我执行以下操作:
class StudTypeSerializer(serializers.Serializer):
"""
StudType objects are serialized into 'Steel, 2x4, 16" o.c.' notation.
"""
MATERIAL_CHOICES = (
('Steel', 'steel'),
)
size = serializers.CharField(
source='studs_size',
label='Type of stud, joist, etc. (2x4, 2x6, etc)')
spacing = serializers.FloatField(
source='studs_spacing')
material = SimulationMappingField(source='studs_material', choices=MATERIAL_CHOICES)
def create(self, validated_data):
raise NotImplementedError
def update(self, instance, validated_data):
raise NotImplementedError
def to_representation(self, instance):
try:
material = instance.pop('material')
size = instance.pop('size')
spacing = instance.pop('spacing')
except KeyError:
return 'None'
return f'{material}, {size}, {spacing}\'\' o.c.'
def to_internal_value(self, data):
if data == 'None':
return {}
material, size, spacing = [col.strip() for col in data.split(',')]
return {
'material': material,
'size': size,
'spacing': spacing
}
当我对导入数据执行此操作时出现问题:
def test_import(self):
obj = Wall(
component_library=self.library)
obj.save()
data = {
'foundationwall': {
'foundationwallType': {
'studtype': 'Steel, 2x4, 16" o.c.'
}
}
}
serializer = FoundationWallSerializer(instance=obj, data=data)
serializer.is_valid(raise_exception=True)
serializer.save()
self.assertEqual(json.loads(json.dumps(serializer.data)), data)
instance
在to_representation
方法中没有material
spacing
和size
,我收到:
- {'foundationwall': {'foundationwallType': {'studtype': 'None'}}}
出口工程罚款代码
def test_export(self):
obj = Wall(
component_library=self.library,
system_identifier='test-wall',
same_as=None,
area=1,
studs_spacing='16',
studs_size='2x4',
studs_material='steel')
obj.save()
serializer = FoundationWallSerializer(instance=obj)
xml = xmltodict.unparse(serializer.data)
self.assertEqual(json.loads(json.dumps(serializer.data)), {
'foundationwall': {
'foundationwallType': {
'studtype': 'Steel, 2x4, 16" o.c.'
}
}
})
目前没有回答
相关问题 更多 >
编程相关推荐