recherche

Maison  >  Questions et réponses  >  le corps du texte

python - Comment Django ModelSerializer POST soumet-il des champs qui ne sont pas définis dans les modèles ou dans les tables associées ?

J'utilise le framework djangorestframework pour fournir une interface pour le client de l'application. Maintenant, je rencontre le problème suivant. La table IWannaImages a une clé étrangère vers la table IWanna. Maintenant, lorsque je soumets les données IWanna via l'interface POST, je ne peux pas les obtenir. les informations du client POST vers la table associée IwannaImages

.

Voici le contenu de validated_data, les données soumises par le client que j'ai imprimées :

{u'platform': u'ios', u'reason': u'\u5b81\u65e5\u8363\u6e7f\u7b54\u7b54\u53d1\u751f\u7684\u53d1\u7ed9\u6211\u7684', u'error_type': u'\u8f6f\u4ef6\u9519\u8bef', u'user_id': 56, u'wanna_type': u'\u7ea0\u9519\u8bef'}

D'après les résultats de l'impression, on peut voir que l'arrière-plan ne reçoit pas les données d'images transmises par le client. J'ai l'impression qu'il y a un problème avec le sérialiseur. Comment dois-je gérer l'interface ?

models.py

class IWanna(models.Model):
    wanna_type = models.CharField(max_length=32, verbose_name=_("I wanna type"))
    scene_name = models.CharField(max_length=128, null=True, blank=True, verbose_name=_("scene name"))
    city_name = models.CharField(max_length=128, null=True, blank=True, verbose_name=_("city name"))
    reason = models.TextField(null=True, blank=True, verbose_name=_("wanna reason"))
    user_id = models.IntegerField(verbose_name=_("user id"))
    platform = models.CharField(max_length=32, verbose_name=_("platform"))
    error_type = models.CharField(max_length=128, null=True, blank=True, verbose_name=_("error type"))
    image = models.ImageField(upload_to=wanna_image_upload_to, null=True, blank=True, verbose_name=_("image"))
    improve_type = models.CharField(max_length=32, null=True, blank=True, verbose_name=_("improve type"))

    class Meta:
        app_label = 'people'
        verbose_name = _("I Wanna")
        verbose_name_plural = _("I Wanna")

    def __unicode__(self):
        return "{}-{}".format(self.id, self.wanna_type)


class IWannaImages(models.Model):
    iwanna = models.ForeignKey("IWanna", related_name="images", verbose_name=_("i wanna type"))
    image = models.ImageField(upload_to=wanna_image_upload_to, verbose_name=_("image"))

sérialiseurs.py

class IWannaSerializer(serializers.ModelSerializer):
    images = serializers.SerializerMethodField()

    class Meta:
        model = IWanna
        fields = (
            "id", "wanna_type", "scene_name", "city_name", "reason", "user_id",
            "platform", "error_type", "images", "improve_type", "image"
        )
        depth = 1

    def validate(self, attrs):
        if attrs["platform"] not in ["ios", "android"]:
            raise ValidationError({"platform": "platform not allowed"})
        return attrs

    def get_images(self, instance):
        data = IWannaImageSerializer(instance.images, many=True).data
        return data

    def create(self, validated_data):
        instance = super(IWannaSerializer, self).create(validated_data)
        try:
            if validated_data["images"]:   # traverse images from app
                for i in validated_data["images"]:
                    IWannaImages.objects.create(iwanna=instance, image=i)
        except Exception, e:
            import logging
            logging.warn(e.message)
        return instance
女神的闺蜜爱上我女神的闺蜜爱上我2787 Il y a quelques jours1093

répondre à tous(1)je répondrai

  • 怪我咯

    怪我咯2017-06-22 11:53:46

    class IWannaSerializer(serializers.ModelSerializer):
        images = serializers.SerializerMethodField()
    
        class Meta:
            model = IWanna
            fields = (
                "id", "wanna_type", "scene_name", "city_name", "reason", "user_id",
                "platform", "error_type", "images", "improve_type", "image"
            )
            depth = 1
    

    Class Meta a une profondeur supplémentaire = 1, donc la liste de niveau inférieur est filtrée. Essayez de la supprimer !

    répondre
    0
  • Annulerrépondre