python - En écrivant l'API Restful de Django, il y a un champ dans la table modèle qui contient une clé étrangère, comment les données de soumission POST du frontend peuvent-elles obtenir la valeur de cette clé étrangère ?
PHP中文网
PHP中文网 2017-05-18 10:57:29
0
1
702

Bonjour à tous, les seniors.
J'écris une interface pour un projet Django. Je souhaite publier une table appelée info via l'interface, afin que d'autres plates-formes puissent transmettre des données à la table d'informations via cette interface.
Mais le champ org dans la table info a une relation de clé primaire et étrangère avec une autre table Org. Il ne peut obtenir que les valeurs de la table Org et ne peut pas la créer lui-même. À l'heure actuelle, je peux accéder à l'interface via l'URL et afficher toutes les informations dans le tableau d'informations. Cependant, lors de la soumission du test via POST, le champ org ne peut pas être soumis et une erreur est toujours signalée.
Je voudrais vous demander comment gérer ce champ et comment définir la méthode de création d'InfoSerializer dans serializer.py.
C'est la première fois que j'écris une API reposante. Je l'ai modifiée après en avoir tiré des leçons en ligne. Veuillez me donner vos conseils.

Ce qui suit est mon code et l'affichage de mon interface API

1.conception du modèle

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讲师

répondre à tous(1)
给我你的怀抱

Dans class Meta中添加depth = 1, puis précisez le nom du champ correspondant.

Voir la documentation officielle pour plus de détails

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!