如何将多对多字段序列化为某些列表,并通过休息框架返回它们?在下面的示例中,我尝试将帖子与一个与之关联的标签列表一起返回.
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
我想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
我在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
我正在研究几个聚合数据的端点.其中一个端点将返回一个对象数组,每个对象对应一天,并且它将具有特定用户发布的评论,喜欢和照片的数量.此对象具有预定义/设置架构,但我们不将其存储在数据库中,因此它没有模型.
有没有一种方法我仍然可以在没有模型的情况下为这些对象使用Django序列化器?
我想建立一种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
我正在使用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-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
考虑这种情况,我有一个Book和Author模型.
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) 我有这样的情况,你有一个自定义嵌套序列化器关系与唯一字段.样例:
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"的类型必须是唯一的,这是真的,但我只是试图关联对象而不是一起创建.
非常感谢!!
Django serializers.pyclass Meta:文件中的类的用途是什么?
python django-models django-views django-serializer django-rest-framework