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 ?
女神的闺蜜爱上我
女神的闺蜜爱上我 2017-06-22 11:51:46
0
1
1035

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
女神的闺蜜爱上我
女神的闺蜜爱上我

répondre à tous(1)
刘奇
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 !

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal