以字符串而不是整数显示

时间:2017-02-24 01:39:48

标签: python django django-models django-rest-framework

我有一个Device和DeviceGroup的表。它们之间的关系是一个设备只能在一个组上,即同一个设备不能在一个以上的组上。但是同一组可以有多个设备。为此我设计了我的模型

模型

class Device(BaseDevice):
    """
    This stores Device
    """
    description = models.TextField(blank=True, null=True)
    device_group = models.ForeignKey('DeviceGroup', null=True, blank=True)
    created_on = models.DateTimeField(auto_now_add=True)
    updated_on= models.DateTimeField(auto_now=True)

class DeviceGroup(models.Model):
    name = models.CharField(max_length=250, blank=False, null=False)
    created_on = models.DateTimeField(auto_now_add=True)
    updated_on= models.DateTimeField(auto_now=True)

串行

class DeviceSerializer(serializers.ModelSerializer):
    id = serializers.UUIDField(source='token', format='hex', read_only=True)
    io = DeviceIOSerializer(read_only=False, many=True, required=False)
    class Meta:
        model = Device
        fields = ('id', 'name', 'description', 'io', 'device_group')

在我的api中,我将整数设备组视为"device_group": 1。如果以字符串形式显示,则应为“device_group”:“personal”。我怎么能在字符串中显示?我的方式是显示Device和DeviceGroup之间的关系吗?

1 个答案:

答案 0 :(得分:0)

你有几个选择。如果您的DeviceGroup模型非常简单,您可以执行此操作,添加模型:

class DeviceGroup(models.Model):
    ...
    def __unicode__(self):
        return self.name

然后您只需在序列化程序上使用StringRelatedField即可。

如果您不想使用模型的字符串表示,请继续阅读:我需要一次这个东西,并为此编写自己的字段。这是

class NameRelatedField(serializers.RelatedField):

    def to_internal_value(self, data):
        try:
            return self.queryset.get(name=data)
        except self.queryset.model.DoesNotExist:
            msg = u"Could not find {!s} named {!r}".format(
                self.queryset.model._meta.verbose_name,
                data,
            )
            raise serializers.ValidationError(msg)

    def to_representation(self, value):
        return six.text_type(value)

现在在你的序列化程序中明确地输入了字段:

class DeviceSerializer(serializers.ModelSerializer):
    ...
    device_group = NameRelatedField(queryset=DeviceGroup.objects.all())

警告:我在名称字段唯一的模型上使用它。如果您的设备组名称可以重复,那么您也希望有更多代码能够处理该案例,或者可能完全重新考虑这个想法。