Skip to main content
 首页 » 编程设计

python之我如何使用 django rest 框架保存多对多字段对象

2024年10月17日34zlslch

我有三个模型博客、已发布、标签。在博客模型中,我将字段“postedin”作为发布模型的外键,并将“标签”作为标签模型的许多字段。

模型.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) 

序列化程序.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”

响应接收:

{tags_id: ["类型不正确。预期的 pk 值,收到的列表。"]}

我是 Django-rest-framework 的初学者。如何解决这个错误。

提前致谢!

请您参考如下方法:

感谢@Abdulafaja 的建议。

终于找到答案了

BlogsSerializer 应该是

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