django 之(二) --- 关系模型增删改查CRUD

关系模型

 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)

猜你喜欢

转载自www.cnblogs.com/TMMM/p/11908041.html