Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python DRF-从嵌套表示创建新对象会引发TypeError_Python_Django_Python 3.x_Serialization_Django Rest Framework - Fatal编程技术网

Python DRF-从嵌套表示创建新对象会引发TypeError

Python DRF-从嵌套表示创建新对象会引发TypeError,python,django,python-3.x,serialization,django-rest-framework,Python,Django,Python 3.x,Serialization,Django Rest Framework,我有以下两种型号: class User(models.Model): user_id = models.CharField( max_length=129, unique=True, ) user_article = models.ManyToManyField( Article, through="UserArticle", ) occupation = models.CharField(

我有以下两种型号:

class User(models.Model):
    user_id = models.CharField(
        max_length=129,
        unique=True,
    )
    user_article = models.ManyToManyField(
        Article,
        through="UserArticle",
    )
    occupation = models.CharField(max_length=100, default='null')

    def __str__(self):
        return self.user_id

使用以下直通模型,使用多对多关系对其进行建模:

class UserArticle(models.Model):    
    user = models.ForeignKey(User, to_field='user_id',
                             on_delete=models.PROTECT,)
    article = models.ForeignKey(Article, to_field='uuid',
                                 on_delete=models.PROTECT,)
    posted_as = ArrayField(
        models.CharField(max_length=100, blank=True),)
    post_date = models.DateField()

    class Meta:
        db_table = "core_user_articles"
以下是我的看法:

class BatchUserArticleList(mixins.ListModelMixin,
                        mixins.CreateModelMixin,
                        generics.GenericAPIView):
    queryset = UserArticle.objects.all()
    serializer_class = BatchUserArticleSerializer

    def create(self, request, *args, **kwargs):
        serializer = BatchUserArticleSerializer(data=request.data)
        if not serializer.is_valid():
            return response.Response({'Message': 'POST failed',
                                  'Errors': serializer.errors},
                                 status.HTTP_400_BAD_REQUEST)
        self.perform_create(serializer)  # equal to serializer.save()
        return response.Response(serializer.data, status.HTTP_201_CREATED)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)
我面临的问题是,当我想在M2M表中发布以下格式的数据时:

{
    "posted_as": ["news"],
    "post_date": "2020-05-26",
    "user": "jhtpo9jkj4WVQc0000GXk0zkkhv7u",
    "article": [
        "11111111",
        "22222222"
    ]
}
由于我没有传递用户或项目实体的精确映射,因此我只传递UID,而没有传递其余的模型字段,因此我的序列化器字段不能是以下字段,因为我收到了验证错误:

user = UserSerializer()
article = ArticleSerializer()
因此,我使用的序列化程序如下所示:

class BatchUserArticleSerializer(serializers.ModelSerializer):
    user = serializers.CharField()
    article = serializers.ListField(
        child=serializers.UUIDField()
    )  
    class Meta:
        model = UserArticle
        fields = '__all__'

    def validate(self, data):    
        post_date = data['post_date']
        if post_date != date.today():
            raise serializers.ValidationError(
                'post_date: post_date is not valid',
            )
        return data

    def create(self, validated_data):
        posted_as = list(map(lambda item: item, validated_data['posted_as']))
        post_date = validated_data['post_date']
        user = validated_data['user']
        list_of_articles = validated_data['article']
        user_object = User.objects.get(user_id=user)
        articles_objects = list(map(lambda res: Article.objects.get(uuid=res), list_of_articles))

        user_articles_to_insert = list(map(
            lambda article: UserArticle(
                posted_as=posted_as,
                post_date=post_date,
                article=article,
                user=user_object),
        articles_objects)

        try:
            created_user_articles = UserArticle.objects.bulk_create(user_articles_to_insert) 
            # returning only the first result since create() expects only one object
            return created_user_articles[0] 
        except Exception as error:
            raise Exception('Something went wrong: {0}'.format(error))
这似乎很好,因为我可以看到我的数据被正确地插入到UserArticle表中:

但是,我在响应中得到以下错误:

  File "core/views.py", line 430, in create
    return response.Response(serializer.data, status.HTTP_201_CREATED)
  File "python3.6/site-packages/rest_framework/serializers.py", line 562, in data
    ret = super().data
  File "python3.6/site-packages/rest_framework/serializers.py", line 260, in data
    self._data = self.to_representation(self.instance)
  File "python3.6/site-packages/rest_framework/serializers.py", line 529, in to_representation
    ret[field.field_name] = field.to_representation(attribute)
  File "python3.6/site-packages/rest_framework/fields.py", line 1692, in to_representation
    return [self.child.to_representation(item) if item is not None else None for item in data]
TypeError: 'Article' object is not iterable

如何序列化此嵌套表示?我在这里做错了什么?

您应该重写序列化程序的表示方法,因为在调用create method call to_representation func以将数据返回到客户端之后,并且因为您更改了用户序列化程序和项目序列化程序,所以此方法无法返回真实数据

def to_representation(self, instance):
    return {'result':{'id':instance.id}}

数据是单个对象,因此不能用于数据中的项……但这是drf框架本身的错误。我做错了什么并导致了这种情况?我通过在to_表示方法中添加serializer=userresourcesializervalue return serializer.data使其正常工作
  File "core/views.py", line 430, in create
    return response.Response(serializer.data, status.HTTP_201_CREATED)
  File "python3.6/site-packages/rest_framework/serializers.py", line 562, in data
    ret = super().data
  File "python3.6/site-packages/rest_framework/serializers.py", line 260, in data
    self._data = self.to_representation(self.instance)
  File "python3.6/site-packages/rest_framework/serializers.py", line 529, in to_representation
    ret[field.field_name] = field.to_representation(attribute)
  File "python3.6/site-packages/rest_framework/fields.py", line 1692, in to_representation
    return [self.child.to_representation(item) if item is not None else None for item in data]
TypeError: 'Article' object is not iterable
def to_representation(self, instance):
    return {'result':{'id':instance.id}}