2017-02-24 11 views
1

私はデバイスとデバイスグループ用のテーブルを持っています。それらの間の関係は、1つのグループのみにあることが可能であり、すなわち、同じデバイスが複数のグループに存在することはできない。しかし、同じグループには複数のデバイスを持つことができます。そのために私は私のAPIのは整数ではなく文字列で表示されます

モデル

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

としての私のモデルを設計している私は"device_group": 1として整数でデバイスグループを参照してください。文字列に表示されている場合は、 "device_group": "personal"でなければなりません。どのように私は文字列で表示できますか? Deviceと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

私のモデルデザインとシリアライザは私のケースに合っていますか?デバイスは1つのグループにしか存在できません(同じデバイスは複数のグループに含めることはできません)が、グループには複数のデバイスを含めることができます。 – Serenity

+0

DeviceSerializer内でdevice_group = serializers.StringRelatedField(many = True)を実行すると、空のデータオブジェクトが取得されます。 – Serenity

関連する問題