我有一个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之间的关系吗?
答案 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())
警告:我在名称字段唯一的模型上使用它。如果您的设备组名称可以重复,那么您也希望有更多代码能够处理该案例,或者可能完全重新考虑这个想法。