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.
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))
在
class Meta
中添加depth = 1
,然后指定相应的字段名。详见官方文档