标签: django-serializer

Django休息框架序列化很多到很多领域

如何将多对多字段序列化为某些列表,并通过休息框架返回它们?在下面的示例中,我尝试将帖子与一个与之关联的标签列表一起返回.

models.py

class post(models.Model):
    tag = models.ManyToManyField(Tag)
    text = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)

serializers.py

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ("text", "tag"??)
Run Code Online (Sandbox Code Playgroud)

views.py

class PostViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
Run Code Online (Sandbox Code Playgroud)

python django django-models django-serializer django-rest-framework

58
推荐指数
5
解决办法
5万
查看次数

保存前编辑django-rest-framework序列化程序对象

我想django-rest-framwork在保存之前编辑序列化程序对象.这就是我目前的做法 -

def upload(request):
    if request.method == 'POST':
        form = ImageForm(request.POST, request.FILES)
        if form.is_valid(): # All validation rules pass
             obj = form.save(commit=False)
             obj.user_id = 15
             obj.save()
Run Code Online (Sandbox Code Playgroud)

如何使用django-rest-framework序列化程序对象执行此操作?

@api_view(['POST','GET'])
def upload_serializers(request):
    if request.method == 'POST':
         serializer = FilesSerializer(data=request.DATA, files=request.FILES)
         if serializer.is_valid():
              serializer.save()
Run Code Online (Sandbox Code Playgroud)

python django serialization django-serializer django-rest-framework

39
推荐指数
2
解决办法
2万
查看次数

在Django REST框架序列化程序中动态排除或包含字段

我在Django REST框架中有一个序列化程序,定义如下:

class QuestionSerializer(serializers.Serializer):
    id = serializers.CharField()
    question_text = QuestionTextSerializer()
    topic = TopicSerializer()
Run Code Online (Sandbox Code Playgroud)

现在我有两个使用上述序列化程序的API视图:

class QuestionWithTopicView(generics.RetrieveAPIView):
    # I wish to include all three fields - id, question_text
    # and topic in this API.
    serializer_class = QuestionSerializer

class QuestionWithoutTopicView(generics.RetrieveAPIView):
    # I want to exclude topic in this API.
    serializer_class = ExamHistorySerializer
Run Code Online (Sandbox Code Playgroud)

一种解决方案是编写两个不同的序列化器.但必须有一个更容易的解决方案来有条件地从给定的序列化器中排除一个字段.

python django serialization django-serializer django-rest-framework

31
推荐指数
2
解决办法
1万
查看次数

没有模型的Django REST框架序列化器

我正在研究几个聚合数据的端点.其中一个端点将返回一个对象数组,每个对象对应一天,并且它将具有特定用户发布的评论,喜欢和照片的数量.此对象具有预定义/设置架构,但我们不将其存储在数据库中,因此它没有模型.

有没有一种方法我仍然可以在没有模型的情况下为这些对象使用Django序列化器?

django django-serializer django-rest-framework

26
推荐指数
1
解决办法
2万
查看次数

AssertionError:`HyperlinkedIdentityField`需要序列化程序上下文中的请求

我想建立一种many-to-many关系,一个人可以在许多俱乐部,一个俱乐部可以有很多人.我加入了models.py,并serializers.py为下面的逻辑,但是当我试图序列化在命令提示符下,我碰到下面的错误-我是什么错在这里做什么?我连一个都没有HyperlinkedIdentityField

Traceback (most recent call last):
File "<console>", line 1, in <module>
File "C:\Users\user\corr\lib\site-packages\rest_framework\serializers.py", line 503, in data
ret = super(Serializer, self).data
File "C:\Users\user\corr\lib\site-packages\rest_framework\serializers.py", line 239, in data
self._data = self.to_representation(self.instance)
File "C:\Users\user\corr\lib\site-packages\rest_framework\serializers.py", line 472, in to_representation
ret[field.field_name] = field.to_representation(attribute)
File "C:\Users\user\corr\lib\site-packages\rest_framework\relations.py", line 320, in to_representation"the serializer." % self.__class__.__name__
AssertionError: `HyperlinkedIdentityField` requires the request in the serializer context. Add `context={'request': request}` when instantiating the serializer.
Run Code Online (Sandbox Code Playgroud)

models.py

class Club(models.Model):
    club_name = models.CharField(default='',blank=False,max_length=100)

class Person(models.Model): …
Run Code Online (Sandbox Code Playgroud)

python django django-views django-serializer django-rest-framework

22
推荐指数
3
解决办法
1万
查看次数

如何从序列化程序输出中动态删除字段

我正在使用Django Rest框架开发API,我想动态删除序列化程序中的字段.问题是我需要根据另一个字段的值删除它们.我怎么能这样做?我有一个序列化器,如:

class DynamicSerliazer(serializers.ModelSerializer):
    type = serializers.SerializerMethodField()
    url = serializers.SerializerMethodField()
    title = serializers.SerializerMethodField()
    elements = serializers.SerializerMethodField()

    def __init__(self, *args, **kwargs):
        super(DynamicSerliazer, self).__init__(*args, **kwargs)
        if self.fields and is_mobile_platform(self.context.get('request', None)) and "url" in self.fields:
            self.fields.pop("url")
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我已经删除了字段"url",具体取决于请求是否已从移动平台完成.但是,我想根据"类型"值删除"元素"字段.我该怎么办?

提前致谢

django-serializer django-rest-framework

18
推荐指数
2
解决办法
8152
查看次数

Serializer上的SerializerClass字段从主键保存

我正在使用Django-rest-framework开发API并从Web应用程序中使用它.它有一个医生模型,带有来自django.auth用户模型的Fk.我想从表单发布到Physician Model,但序列化程序返回此消息:

{"user":{"non_field_errors":["数据无效.预计字典,但得到unicode."]}}

我正在发送用户对象的主键.哪个是在DRF上存储外键的权利(或只是一种方式).我已尝试在序列化程序上覆盖get_validation_exclusions并覆盖viewset上的perform_create方法.

api和web应用程序是分离的.API是使用django和带有angularjs的web应用程序开发的.

我的模特

class Physician(models.Model):
    medical_office_number = models.CharField(max_length = 15)
    fiscal_id_number = models.CharField(max_length = 20)
    user = models.OneToOneField(User)

    def __unicode__(self):
        return self.user.first_name +' '+ self.user.last_name
Run Code Online (Sandbox Code Playgroud)

串行:

class PhysicianSerializer(serializers.ModelSerializer):
    user = AccountSerializer()
    class Meta:
        model = Physician
        fields = ('id', 'user', 'medical_office_number', 'fiscal_id_number')
        read_only_fields = ('id')
        depth = 1
    def get_validation_exclusions(self, *args, **kwargs):
        exclusions = super(PhysicianSerializer, self).get_validation_exclusions()
        return exclusions + ['user']
Run Code Online (Sandbox Code Playgroud)

*编辑这是我的帐户序列化程序,它基于此实现和@Kevin Brown建议

class PrimaryKeyNestedMixin(serializers.RelatedField, serializers.ModelSerializer):

    def to_internal_value(self, data):
        return serializers.PrimaryKeyRelatedField.to_internal_value(self, data)
    def to_representation(self, data):
        return serializers.ModelSerializer.to_representation(self, data) …
Run Code Online (Sandbox Code Playgroud)

python django serialization django-serializer django-rest-framework

16
推荐指数
1
解决办法
7349
查看次数

根据请求类型更改Django REST Framework ModelSerializer中的字段?

考虑这种情况,我有一个BookAuthor模型.

serializers.py

class AuthorSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.Author
        fields = ('id', 'name')

class BookSerializer(serializers.ModelSerializer):
    author = AuthorSerializer(read_only=True)

    class Meta:
        model = models.Book
        fields = ('id', 'title', 'author')
Run Code Online (Sandbox Code Playgroud)

viewsets.py

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
Run Code Online (Sandbox Code Playgroud)

如果我发送GET书籍请求,这很有用.我得到一个带有嵌套序列化程序的输出,其中包含书籍详细信息和嵌套作者详细信息,这就是我想要的.

然而,当我要创建/更新的一本书,我要送一POST/ PUT/ PATCH与作者而不只是它们的ID的嵌套的细节.我希望能够通过指定作者ID而不是整个作者对象来创建/更新书籍对象.

所以,我的序列化器看起来像这样的GET请求

class BookSerializer(serializers.ModelSerializer):
    author = AuthorSerializer(read_only=True)

    class Meta:
        model = models.Book
        fields = ('id', 'title', 'author')
Run Code Online (Sandbox Code Playgroud)

和我的串行器看起来像这样的POST,PUT,PATCH请求

class BookSerializer(serializers.ModelSerializer):
    author = …
Run Code Online (Sandbox Code Playgroud)

django django-serializer django-rest-framework

14
推荐指数
3
解决办法
1万
查看次数

关于Django Rest Framework上嵌套序列化器的唯一验证

我有这样的情况,你有一个自定义嵌套序列化器关系与唯一字段.样例:

class GenreSerializer(serializers.ModelSerializer):

    class Meta:
        fields = ('name',) #This field is unique
        model = Genre

class BookSerializer(serializers.ModelSerializer):

    genre = GenreSerializer()

    class Meta:
        model = Book
        fields = ('name', 'genre')

    def create(self, validated_data):
        genre = validated_data.pop('genre')
        genre = Genre.objects.get(**genre)
        return Book.objects.create(genre=genre, **validated_data)
Run Code Online (Sandbox Code Playgroud)

问题:当我尝试保存json对象如{"name":"The Prince","genre":{"name":"History"}} DRF尝试验证流派对象的唯一约束以及"History" exists抛出一个例外,因为一个名为"History"的类型必须是唯一的,这是真的,但我只是试图关联对象而不是一起创建.

非常感谢!!

python django rest django-serializer django-rest-framework

11
推荐指数
1
解决办法
4303
查看次数