Salam semua, warga emas.
Saya sedang menulis antara muka untuk projek Django Saya ingin mengeluarkan jadual yang dipanggil info melalui antara muka, supaya platform lain boleh menghantar data ke jadual maklumat melalui antara muka ini.
Tetapi medan org dalam jadual maklumat mempunyai hubungan kunci utama dan asing dengan Org jadual lain Ia hanya boleh mendapatkan nilai daripada jadual Org dan tidak boleh menciptanya sendiri. Pada masa ini, saya boleh mengakses antara muka melalui URL dan melihat semua maklumat dalam jadual maklumat Walau bagaimanapun, apabila menghantar ujian melalui POST, medan org tidak boleh diserahkan dan ralat sentiasa dilaporkan.
Saya ingin bertanya kepada anda cara mengendalikan medan ini dan bagaimana untuk menentukan kaedah penciptaan InfoSerializer dalam serializer.py.
Ini adalah kali pertama saya menulis RESTful API. Saya mengubah suainya selepas belajar daripadanya dalam talian.
1.reka bentuk model
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))
Dalam
class Meta
中添加depth = 1
, dan kemudian nyatakan nama medan yang sepadan.Lihat dokumentasi rasmi untuk butiran