2017-02-24 64 views
1

我有一个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”:“个人”。我如何显示字符串?也是我的方式来显示设备和DeviceGroup之间的关系吗?

回答

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()) 

警告:我用它在车型在名称字段中是独一无二的。如果您的设备组名称可以重复,您需要更多的代码来处理这种情况,或者可能完全重新考虑这个想法。

+0

这个名字在我的案例中是独一无二的。我会试着去理解这里发生的事情。 – Serenity

+0

我的模型设计和序列化是否适合我的案例?设备只能在一个组中(同一设备不能在多个组中),但一个组可以有多个设备。 – Serenity

+0

当我做device_group = serializers.StringRelatedField(许多= True)里面的DeviceSerializer我得到空的数据对象。 – Serenity

相关问题