django restframework 多對多模型
阿新 • • 發佈:2020-12-15
1。模型
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)
postman測試: