python - Beim Schreiben der Restful-API von Django gibt es ein Feld in der Modelltabelle, das einen Fremdschlüssel enthält. Wie kann das Frontend per Post übermittelte Daten den Wert aus diesem Fremdschlüssel erhalten?
PHP中文网
PHP中文网 2017-05-18 10:57:29
0
1
803

Hallo zusammen, Senioren.
Ich schreibe eine Schnittstelle für ein Django-Projekt. Ich möchte eine Tabelle namens info über die Schnittstelle freigeben, damit andere Plattformen Daten über diese Schnittstelle an die Info-Tabelle übergeben können.
Aber das Org-Feld in der Infotabelle hat eine Primär- und Fremdschlüsselbeziehung mit einer anderen Tabellenorganisation. Es kann nur Werte aus der Org-Tabelle abrufen und diese nicht selbst erstellen. Derzeit kann ich über die URL auf die Schnittstelle zugreifen und alle Informationen in der Infotabelle anzeigen. Beim Absenden des Tests per POST kann das Feld „org“ jedoch nicht übermittelt werden und es wird immer ein Fehler gemeldet.
Ich möchte Sie fragen, wie Sie mit diesem Feld umgehen und wie Sie die Erstellungsmethode von InfoSerializer in serializer.py definieren.
Dies ist das erste Mal, dass ich eine RESTful-API schreibe, nachdem ich online daraus gelernt habe. Bitte geben Sie mir Ihren Rat.

Das Folgende ist meine Code- und API-Schnittstellenanzeige

1.Modelldesign

class Org(models.Model):
    name = models.CharField(verbose_name=u"组织单元", max_length=50)
    other = models.CharField(verbose_name=u"备注", max_length=30)
    
class Info(models.Model):
    datetime = models.DateTimeField(verbose_name=u"时间",default=datetime.now)
    name = models.CharField(verbose_name=u"主机名称", max_length=50)
    ip = models.CharField(verbose_name=u"主机地址", max_length=20)
    org = models.ForeignKey(Org, verbose_name=u"所属单元")
    desc = models.CharField(verbose_name=u"故障描述", max_length=200)
    type = models.CharField(verbose_name=u"故障等级", choices=((u"严重",u"严重"),(u"告警",u"告警"),(u"提醒",u"提醒")), max_length=2)

2.serializers.py

class OrgSerializer(serializers.ModelSerializer):
    class Meta:
        model = Org
        fields = ('id','name')


class InfoSerializer(serializers.ModelSerializer):
    org = OrgSerializer()

    class Meta:
        model = Info
        fields = ('id','name','ip','org','desc','type')
        read_only_fields = ('org',)

    def create(self, validated_data):
        validated_data['org'] = self.context['request'].org
        return Info.objects.create(**validated_data)

3.views.py

class OrgViewSet(viewsets.ModelViewSet):
    queryset = Org.objects.all()
    serializer_class = OrgSerializer
    permission_classes = (permissions.IsAuthenticated,)

class InfoViewSet(viewsets.ModelViewSet):
    queryset = Info.objects.all()
    serializer_class = InfoSerializer
    permission_classes = (permissions.IsAuthenticated,)

    @detail_route(renderer_classes=[renderers.StaticHTMLRenderer])
    def plaintext(self, request, *args, **kwargs):
        model = self.get_object()
        return Response(repr(model))

PHP中文网
PHP中文网

认证高级PHP讲师

Antworte allen(1)
给我你的怀抱

class Meta中添加depth = 1,然后指定相应的字段名。

详见官方文档

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage