我如何使用Django Rest框架保存许多字段对象 [英] How do i save many to many fields objects using django rest framework
问题描述
我有博客,发布,标签的三个模型.在Blogs模型中,我将字段"postedin"作为已发布"模型的外键,并将标签"作为多个"字段作为标签"模型.
I have three models Blogs, Posted, Tags. In Blogs model I have fields 'postedin' as foreign key to Posted model and 'tags' as manytomany fields to Tags model.
models.py:
models.py:
class Posted(models.Model):
name = models.CharField(_('Posted In'),max_length=255, unique=True)
class Tags(models.Model):
name = models.CharField(_('Tag Name'),max_length=255, unique=True)
class Blogs(models.Model):
author = models.ForeignKey(CustomUser)
title=models.CharField(max_length=100)
postedin=models.ForeignKey(Posted)
tags= models.ManyToManyField(Tags)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
views.py:
class BlogViewSet(viewsets.ModelViewSet):
queryset=Blogs.objects.order_by('-created_at')
serializer_class= BlogsSerializer
def get_permissions(self):
if self.request.method in permissions.SAFE_METHODS:
return (permissions.AllowAny(),)
return (permissions.IsAuthenticated(),IsAuthorOfBlog())
def perform_create(self,serializer):
serializer.save(author=self.request.user)
return super(BlogViewSet,self).perform_create(serializer)
serializers.py:
serializers.py:
class TagsSerializer(serializers.ModelSerializer):
class Meta:
model = Tags
fields = ('pk','name')
read_only_fields=('pk','name')
class PostedSerializer(serializers.ModelSerializer):
class Meta:
model = Posted
fields = ('pk','name')
read_only_fields=('pk','name')
class BlogsSerializer(serializers.ModelSerializer):
author = AccountSerializer(read_only=True,required=False)
tags=TagsSerializer(read_only=True,many=True)
tags_id = serializers.PrimaryKeyRelatedField(queryset=Tags.objects.all(), write_only=True)
postedin = PostedSerializer(read_only=True)
postedin_id = serializers.PrimaryKeyRelatedField(queryset=Posted.objects.all(), write_only=True)
class Meta:
model = Blogs
fields = ('pk','author','title','tags','tags_id','postedin','postedin_id','content','created_at','updated_at')
read_only_fields=('pk','created_at','updated_at')
def get_validation_exclusions(self, *args, **kwargs):
exclusions = super(BlogsSerializer, self).get_validation_exclusions()
return exclusions + ['author']
def create(self, validated_data):
postedin = validated_data.pop('postedin_id')
tags = validated_data.pop('tags_id')
blogs = Blogs.objects.create(tags=tags,postedin=postedin, **validated_data)
return blogs
请求已发送:
{标题:"nvnbv",postedin_id:"1",tags_id:["2","5","1","4"],内容:"nmvmvjm"}
{title: "nvnbv", postedin_id: "1", tags_id: ["2", "5", "1", "4"], content: "nmvmvjm"}
收到回复:
{tags_id:[类型不正确.预期的pk值,已接收列表."]}
{tags_id: ["Incorrect type. Expected pk value, received list."]}
我是Django-rest-framework的初学者.如何解决此错误.
I am beginner in Django-rest-framework.How to solve this error.
提前谢谢!
推荐答案
感谢@Abdulafaja的建议.
thanks @Abdulafaja for your suggestion.
最后我找到了解决方法
BlogsSerializer应该是
BlogsSerializer should be
class BlogsSerializer(serializers.ModelSerializer):
author = AccountSerializer(read_only=True,required=False)
tags=TagsSerializer(read_only=True,many=True)
tags_id = serializers.PrimaryKeyRelatedField(queryset=Tags.objects.all(), write_only=True,many=True)
postedin = PostedSerializer(read_only=True)
postedin_id = serializers.PrimaryKeyRelatedField(queryset=Posted.objects.all(), write_only=True)
class Meta:
model = Blogs
fields = ('pk','author','title','tags','tags_id','postedin','postedin_id','content','created_at','updated_at')
read_only_fields=('pk','created_at','updated_at')
def get_validation_exclusions(self, *args, **kwargs):
exclusions = super(BlogsSerializer, self).get_validation_exclusions()
return exclusions + ['author']
def create(self, validated_data):
postedin = validated_data.pop('postedin_id')
tags = validated_data.pop('tags_id')
blogs = Blogs.objects.create(postedin=postedin, **validated_data)
for tg in tags:
blogs.tags.add(tg)
return blogs
这篇关于我如何使用Django Rest框架保存许多字段对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!