Django rest框架多个要打开的字段

2024-05-01 21:29:02 发布

您现在位置:Python中文网/ 问答频道 /正文

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)

instanceto_representation方法中没有materialspacingsize,我收到: - {'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.'
                }
            }
        })

Tags: instanceselftrueobjsourcedatasizedef