关系模型
1:N
- user/url.py
1 from django.urls import path 2 from user.views0 import UserTypeView, SingleUserView 3 4 app_name = 'user' 5 urlpatterns = [ 6 # 注意:::此处必须变量名定义名为pk,否则系统识别不到 7 path('singleuser/<int:pk>', SingleUserView.as_view(), name='user-detail'), 8 path('usertype/', UserTypeView.as_view(), name='usertype'), 9 ]
- user/models.py
1 from django.db import models 2 3 # 1 4 class UserType(models.Model): 5 name = models.CharField(max_length=20, unique=True) 6 add_time = models.DateTimeField(auto_now=True) 7 8 class Meta: 9 db_table = 'user_type' 10 11 def __str__(self): 12 return self.name 13 14 # n 15 class User(models.Model): 16 username = models.CharField(max_length=20, unique=True) 17 password = models.CharField(max_length=128) 18 phone = models.CharField(max_length=11) 19 add_time = models.DateTimeField(auto_now=True) 20 # related_name='users'的作用是:usertype.user_set.all ===> usertype.users.all 21 usertype = models.ForeignKey(to=UserType, on_delete=models.CASCADE, related_name='users', null=True) 22 23 class Meta: 24 db_table = 'user' 25 26 def __str__(self): 27 return self.username
- user/serializers.py
1 from django.contrib.auth.hashers import make_password 2 from rest_framework import serializers 3 from user.models import User, UserType 4 5 class UserSerializerSimple(serializers.ModelSerializer): 6 repassword = serializers.CharField(max_length=128, write_only=True) 7 8 class Meta: 9 model = User 10 fields = ['id', 'username', 'password', 'phone', 'repassword'] 11 12 def validate(self, attrs): 13 if attrs['password'] != attrs['repassword']: 14 raise serializers.ValidationError('两次密码不相等') 15 return attrs 16 17 def create(self, validated_data): 18 username = validated_data['username'] 19 password = validated_data['password'] 20 phone = validated_data['phone'] 21 # 密码加密 22 password = make_password(password) 23 user = User.objects.create(username=username, password=password, phone=phone) 25 return user 26 27 28 class UserTypeSerializer(serializers.ModelSerializer): 29 # StringRelatedField表示定义序列化的关系模型[两张表的关系定义]。many=True 表示有多个值时需要声明为True。 30 # users命名要和模型中外键字段定义的related_name='users'中定义的名字一致,且需要添加到下方Meta的fields中 31 # 最后返回到前端的是对应的从表对象的名称 32 # users = serializers.StringRelatedField(many=True) 33 34 # 也可以使用PrimaryKeyRelatedField。最后返回到前端的是对应的从表对象的主键 35 # users = serializers.PrimaryKeyRelatedField(many=True, read_only=True) 36 37 # 也可以使用 HyperlinkedRelatedField超链接格式,view_name='user:user-detail'需要定义用户的超链接(url) 38 # 最后返回到前端的是对应的从表对象的链接格式(url) 39 users = serializers.HyperlinkedRelatedField(read_only=True, many=True, view_name='user:user-detail') 40 41 class Meta: 42 model = UserType 43 fields = '__all__' 44 46 class SingleUserSerializer(serializers.ModelSerializer): 47 class Meta: 48 model = User 49 fields = ['id', 'username', 'password', 'phone', 'usertype']
serializers.HyperlinkedModelSerializer
- user/views.py
1 from django.http import JsonResponse 2 from rest_framework.views import APIView 3 from user.models import User, UserType 4 from user.serializers import UserTypeSerializer, SingleUserSerializer, \ 5 UserSerializerSimple 6 7 class UserViewsSimple(APIView): 8 def get(self, request): 9 pass 10 def post(self, request): 11 user_serializer = UserSerializerSimple(data=request.data) 12 if user_serializer.is_valid(): 13 user_serializer.save() 14 return JsonResponse({'status': 200, 'user': user_serializer.data}) 15 16 17 class UserTypeView(APIView): 18 def get(self, request): 19 usertypes = UserType.objects.all() 20 # 将从数据库中查询到的数据在UserTypeSerializer中进行序列化。 21 # many=True自动将usertypes转为列表类型,只要序列化的是"多",就得添加 22 serializer = UserTypeSerializer(usertypes, many=True, context={'request': request}) 23 data = { 24 'status': 200, 25 'types': serializer.data 26 } 27 return JsonResponse(data) 28 29 30 class SingleUserView(APIView): 31 def get(self, request, pk): 32 user = User.objects.get(pk=pk) 33 serializer = SingleUserSerializer(user, context={'request': request}) 34 data = { 35 'status': 200, 36 'types': serializer.data 37 } 38 return JsonResponse(data)