django restframework 多对多模型 —— python

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

python 复制代码
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

序列化器:

python 复制代码
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__"

视图以图书为例:

python 复制代码
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)<br>  

序列化器结构:

postman测试:

创建单个图书:

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

多对多删除:

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"})

批量删除:

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

相关推荐
古城小栈4 小时前
Java 内存优化:JDK 22 ZGC 垃圾收集器调优
java·python·算法
serve the people4 小时前
tensorflow 零基础吃透:tf.sparse.SparseTensor 与核心 TensorFlow API 的协同使用
人工智能·python·tensorflow
SoleMotive.4 小时前
redis和mysql有什么区别,以及redis和mysql都有什么缺点,以及什么地方redis不如mysql?
数据库·redis·mysql
代码代码快快显灵4 小时前
Android跨应用数据共享:ContentProvider详解
jvm·数据库·oracle
雍凉明月夜4 小时前
视觉opencv学习笔记Ⅴ-数据增强(2)
人工智能·python·opencv·计算机视觉
聪明努力的积极向上4 小时前
【MYSQL】IN查询优化
数据库·mysql
济南java开发,求内推4 小时前
MongoDB: 升级版本至:5.0.28
数据库·mongodb
小灰灰搞电子4 小时前
Qt PDF模块详解
数据库·qt·pdf
老华带你飞4 小时前
健身房预约|基于springboot 健身房预约小程序系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·小程序
梁萌4 小时前
MySQL主从数据同步实战
数据库·mysql