首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django Rest Framework @未保存

Django Rest Framework @未保存
EN

Stack Overflow用户
提问于 2015-08-13 01:18:51
回答 3查看 340关注 0票数 0

每当我向django应用程序发出POST请求时,它都会抛出一个错误

代码语言:javascript
复制
'Genre' instance expected, got (<Genre: Adventure>, False)

我无法理解为什么这是序列化程序的happening.Please帮助。我的电影对象正在被保存,但是体裁对象并不是因为这个错误。

模型

代码语言:javascript
复制
class Movie(models.Model):
    popularity = models.FloatField()
    director = models.CharField(max_length=255)
    imdb_score = models.FloatField()
    name = models.CharField(max_length=255,)

    def __unicode__(self):
        return u'%s' % (self.name)

class Genre(models.Model):
    name =  models.ForeignKey(Movie,related_name='genres',blank=True, null=True)
    genre = models.CharField(max_length=255)

    def __unicode__(self):
        return u'%s' % (self.genre)

串行化器

代码语言:javascript
复制
class CreatableSlugRelatedField(serializers.SlugRelatedField):

    def to_internal_value(self, data):
        try:
            return self.get_queryset().get_or_create(**{self.slug_field: data})
        except ObjectDoesNotExist:
            self.fail('does_not_exist', slug_name=self.slug_field, value=smart_text(data))
        except (TypeError, ValueError):
            self.fail('invalid')

class MovieSerializer5(serializers.ModelSerializer):
    genres = CreatableSlugRelatedField(many=True,slug_field='genre',queryset=Genre.objects.all())
    class Meta:
        model = Movie
        fields = ('popularity', 'director','imdb_score', 'name', 'genres')

视图

代码语言:javascript
复制
class MovieList(APIView):
    def post(self, request, format=None):
        if not request.user.is_superuser:
            return Response("User is not permitted this action")

        serializer = MovieSerializer5(data=request.data)
        print serializer.initial_data
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
EN

回答 3

Stack Overflow用户

发布于 2015-08-13 01:27:15

当您使用帮助器get_or_create时,它返回一个带有对象的元组(创建与否),以及一个布尔值,该布尔值指示对象是创建的还是已经在db上,请注意;)

票数 0
EN

Stack Overflow用户

发布于 2015-08-13 01:56:56

get_or_create返回(object,created)的元组,因此在序列化程序的to_internal_value中,您需要如下所示:

代码语言:javascript
复制
return self.get_queryset().get_or_create(**{self.slug_field: data})[0]

若要访问创建或检索的对象,请执行以下操作。

票数 0
EN

Stack Overflow用户

发布于 2015-08-13 02:46:34

您只需要返回创建的对象.

get_or_create实际上返回(object, created)的元组,其中object是检索或创建的对象,created是指定是否创建新对象的布尔值。

你可以这样做:

代码语言:javascript
复制
obj, created = self.get_queryset().get_or_create(**{self.slug_field: data})
return obj # return the created object
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31977981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档