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

批量删除:

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

相关推荐
数据知道15 分钟前
FastAPI项目:构建打字速度测试网站(MySQL版本)
数据库·python·mysql·fastapi·python项目
vvoennvv18 分钟前
【Python TensorFlow】CNN-BiLSTM-Attention时序预测 卷积神经网络-双向长短期记忆神经网络组合模型带注意力机制(附代码)
python·神经网络·cnn·tensorflow·lstm·bilstm·注意力
程序员爱钓鱼30 分钟前
Python 编程实战:环境管理与依赖管理(venv / Poetry)
后端·python·trae
程序员爱钓鱼32 分钟前
Python 编程实战 :打包与发布(PyInstaller / pip 包发布)
后端·python·trae
姓蔡小朋友39 分钟前
redis GEO数据结构、实现附近商铺功能
数据结构·数据库·redis
冉冰学姐1 小时前
SSM农贸市场摊位管理系统c22ux(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·农贸市场·摊位管理系统
我叫侯小科1 小时前
PyTorch 实战:手写数字识别(MNIST)从入门到精通
人工智能·pytorch·python
青衫客361 小时前
浅谈 Python 的 C3 线性化算法(C3 Linearization):多继承背后的秩序之美
python·mro·c3线性化算法
面向星辰1 小时前
SQL LIKE 相似信息查找语句
数据库·sql
Gitpchy1 小时前
Day 47 注意力热图可视化
python·深度学习·cnn