2017-02-24 3 views
1

Ich habe eine Tabelle für Device und DeviceGroup. Die Beziehung zwischen ihnen ist ein Gerät kann nur auf einer Gruppe sein, d. H. Das gleiche Gerät kann nicht auf mehr als einer Gruppe sein. Aber dieselbe Gruppe kann mehrere Geräte haben. Dafür habe ich mein Modell haben entworfen alsIn String anstelle von Ganzzahl anzeigen

Modelle

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) 

Serializer

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

in meiner api siehe i-Gerätegruppe in integer als "device_group": 1. Wenn es in einer Zeichenfolge angezeigt wird, sollte es "device_group": "personal" sein. Wie kann ich in einer Zeichenfolge anzeigen? Auch ist meine Art, die Beziehung zwischen Device und DeviceGroup richtig zu zeigen?

Antwort

0

Sie haben hier ein paar Optionen. Wenn Ihr DeviceGroup Modell wirklich so einfach ist, dies zu tun, fügen Sie im Modell:

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

Dann können Sie einfach ein StringRelatedField auf dem Serializer verwenden.


Wenn Sie nicht mit der String-Darstellung des Modells Dreck wollen, dann lesen Sie weiter: ich diese Sache einmal erforderlich, und schrieb für sie mein eigenes Feld. Hier ist sie

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) 

Jetzt in Ihrem Serializer das Feld setzen explizit:

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

Warnung: Ich benutzte es bei den Modellen, wo der Name Feld einzigartig war. Wenn die Namen Ihrer Gerätegruppe dupliziert werden können, benötigen Sie mehr Code, um diesen Fall zu bearbeiten oder die Idee komplett zu überdenken.

+0

Der Name ist in meinem Fall einzigartig. Ich werde das versuchen, um zu verstehen, was hier passiert. – Serenity

+0

Ist mein Modell Design und Serializer richtig mit meinem Fall? Ein Gerät kann sich nur in einer Gruppe befinden (dasselbe Gerät kann nicht in mehr als einer Gruppe sein), aber eine Gruppe kann mehrere Geräte haben. – Serenity

+0

Wenn ich Device_group = serializers.StringRelatedField (viele = True) innerhalb DeviceSerializer ich bekomme leere Datenobjekt. – Serenity

Verwandte Themen