1 models.py
2
3 from django.db import models
4
5 '''
6 书跟出版社 一对多
7 书跟作者 多对多
8
9 '''
10
11
12 class Book(models.Model):
13 title = models.CharField(max_length=32)
14 price = models.IntegerField()
15 pub_date = models.DateTimeField()
16 publish = models.ForeignKey('Publish', on_delete=models.CASCADE, null=True)
17 author = models.ManyToManyField('Author')
18
19 # __str__ 可以把想要返回的字段名显示在前端 如果没有__str__ 外键只会显示什么对象
20 def __str__(self):
21 return self.title
22
23 def text(self):
24 return 'wo xi huan lzw'
25
26
27 class Publish(models.Model):
28 name = models.CharField(max_length=32)
29 email = models.EmailField()
30
31 def __str__(self):
32 return self.name
33
34
35 class Author(models.Model):
36 name = models.CharField(max_length=32)
37 age = models.IntegerField()
38
39 def __str__(self):
40 return self.name
41 url.py
42
43 from django.urls import path, re_path, include
44
45 from app02 import views
46
47 urlpatterns = [
48
49 re_path(r'books/(?P<pk>\d+)', views.Book2View.as_view()),
50
51 ]
52
53 view.py
54 '''
55 四:
56 source三种用法
57
58 D:\python\pychar\djangoProject\django528\venv\Lib\site-packages\django\views\debug.py 333
59
60 '''
61
62 from django.shortcuts import render
63
64 from rest_framework.views import APIView
65 from rest_framework.response import Response
66
67 from . import models
68 from . import serializer
69
70 dic = {
71 'code': '100',
72 'msg': '',
73 }
74
75
76 class Book2View(APIView):
77 # 单查
78 def get(self, request, pk):
79 book = models.Book.objects.filter(id=pk).first()
80 book_ser = serializer.Book2Serializer(instance=book)
81 dic['code'] = '100'
82 dic['msg'] = '成功'
83 dic['data'] = book_ser.data
84 return Response(data=dic)
85 serializer.py
86
87 from rest_framework import serializers
88 from rest_framework.exceptions import ValidationError
89
90 from . import models
91
92
93 class Book2Serializer(serializers.Serializer):
94 # title = serializers.CharField()
95 # 1. 修改字段
96 name = serializers.CharField(source='title')
97 price = serializers.CharField()
98
99 # pub_date = serializers.CharField()
100 # 1. 支持方法
101 pub_date = serializers.CharField(source='text')
102
103 # Publish = serializers.CharField()
104
105 # 2. 跨表 source='publish.email' --book.publish.email 不写source -- book.字段名字
106 publish = serializers.CharField(source='publish.email')
107
108 # author = serializers.CharField()
109
110 authors = serializers.SerializerMethodField()
111 # 3. 与 serializers.SerializerMethodField() 配套使用 return 什么 前端就显示什么
112 # get_字段
113 def get_authors(self, instance):
114 # instance--book对象
115 authors = instance.author.all()
116 li = []
117 for author in authors:
118 li.append({'name': author.name, 'age': author.age})
119 return li
120