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

批量删除:

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

相关推荐
copyer_xyf29 分钟前
LangChain 调用 LLM
后端·python·agent
无敌的牛34 分钟前
redis学习过程
数据库·redis·学习
IT北辰38 分钟前
神通数据库管理系统V7.0.251210 for Windows(x86 64bit)安装部署
数据库·神通
copyer_xyf39 分钟前
Prompt 组织管理
后端·python·agent
北顾笙9801 小时前
MySQL-day2
数据库·mysql
Demons_kirit1 小时前
新项目如何连接上自己本地的数据库
数据库
shimly1234561 小时前
python3 uvicorn 是啥?
python
洪晓露2 小时前
将 rke2 集群证书延长至 10 年
运维·服务器·数据库
CTA量化套保2 小时前
期货量化程序 time.sleep 卡死:天勤单线程与 deadline 替代
python·区块链
程序猿乐锅2 小时前
【MySQL | 第八篇】MySQL 视图
数据库·mysql