django restframework 多对多模型 —— python

2024-06-29 1507阅读

模型 图书和作者是多对多关系

class Book(models.Model):
    book_name=models.CharField(max_length=40)
    price=models.DecimalField(max_digits=4,decimal_places=2)
    publish=models.ForeignKey(to="Publish",on_delete=models.CASCADE,related_name="publish")
    author=models.ManyToManyField(to="Author",related_name="author")
    class Meta:
        db_table="tbl_book"
    # def __str__(self):
    #     return self.book_name
class Publish(models.Model):
    publish_name=models.CharField(max_length=20)
    address=models.CharField(max_length=30)
    class Meta:
        db_table="tbl_publish"
    # def __str__(self):
    #     return self.publish_name
class Author(models.Model):
    sex_choices=[(0,"男"),(1,"女")]
    name=models.CharField(max_length=20,unique=True)
    phone=models.BigIntegerField()
    sex=models.IntegerField(choices=sex_choices)
    class Meta:
        db_table="tbl_author"
    # def __str__(self):
    #     return self.name

序列化器:

class SerBook(serializers.ModelSerializer):
    """  add(1) add(1,2), set(list_object), remove(1), remove(1,2) or remove(*[1,2])"""
    #publish = serializers.PrimaryKeyRelatedField(queryset=Publish.objects.all())
    #author = serializers.PrimaryKeyRelatedField(allow_empty=False, many=True, queryset=Author.objects.all())
    class Meta:
        model=Book
        fields="__all__"

class  SerPublish(serializers.ModelSerializer):
    class Meta:
        model = Publish
        fields = "__all__"
class  SerAuthor(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = "__all__"

 

视图以图书为例:

class BookView(APIView):

    def get(self,request,*args,**kwargs):
        pk= kwargs.get("id")
        if pk :
            inst = Book.objects.filter(id=kwargs.get("id")).first()
            if inst:
                ser = SerBook(instance=inst, many=False)
                return Response(data=ser.data, status=200)
            else:
                return Response(data={"msg": "not found", "data": []}, status=200)
        else:
            inst = Book.objects.all()
            ser = SerBook(instance=inst, many=True)
            return Response(data=ser.data, status=200)

    def post(self,request,*args,**kwargs):
        data=request.data
        many=False
        if isinstance(data,list):
          many=True
        ser = SerBook(data=data, many=many)
        if ser.is_valid():
            ser.save()
            return Response(data=ser.data, status=status.HTTP_200_OK)
        else:
            return Response(data=ser.errors, status=status.HTTP_404_NOT_FOUND)

    def put(self,request,*args,**kwargs):
         data=request.data
         pk=kwargs.get("id")
         if pk :
            inst=Book.objects.filter(id=pk).first()
            print(Book.objects.filter(id=pk).values().first(),"xxxx")
            if inst:
                ser = SerBook(instance=inst, many=False,data=data
                              )
                if ser.is_valid():
                    ser.save()
                return Response(data=ser.data, status=200)
  

 序列化器结构:

django restframework 多对多模型 —— python

postman测试:

创建单个图书:

django restframework 多对多模型 —— python

PUT  修改图书根据图书book  id:

django restframework 多对多模型 —— python

多对多删除:

def delete(self,request,*args,**kwargs):
    pk= kwargs.get("id")
    data=request.data
    if pk:
        inst=Book.objects.filter(id=pk).first()
        if inst:
            inst.delete()
            return Response(data={"code":200,"msg":"删除ok"})
        else: return Response(data={"code":404,"msg":"删除失败,不存在!"})
    else:
        ids=data.get("ids")
        if isinstance(ids,list):
            objs=Book.objects.filter(id__in=ids)
            objs.delete()
            return Response(data={"code":200,"msg":"删除ok"})

 

批量删除:

django restframework 多对多模型 —— python

本次分享到此结束,感谢大家的阅读! 

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]