标签:inf you try rac 灰色 model 字段 time related
from django.db import models
'''
汽车表,汽车商家表,赞助商表,赞助商详情表
'''
# Create your models here.
# 基表
class Base(models.Model):
is_delete = models.BooleanField(default=False, verbose_name='是否注销')
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
class Meta:
abstract = True
# 汽车商家表
class CarStore(Base):
name = models.CharField(max_length=64, verbose_name='汽车商家名')
address = models.CharField(max_length=64, verbose_name='汽车商家地址')
@property
def car_info(self):
return {
'name':self.cars.name,
# 'price':self.cars.price,
}
# 赞助商表
class CarSponsor(Base):
name = models.CharField(max_length=64, verbose_name='赞助商名')
address = models.CharField(max_length=64, verbose_name='赞助商地址')
# 赞助商详情表
class SponsorDetail(Base):
mobile = models.CharField(max_length=64, verbose_name='联系方式')
sponsor = models.OneToOneField(to=CarSponsor, related_name='detail', db_constraint=False,
on_delete=models.DO_NOTHING, null=True)
# 汽车表
class Car(Base):
COLOR_CHOICES = (
(0, '银色'),
(1, '黑色'),
(2, '红色'),
(3, '灰色'),
)
name = models.CharField(max_length=64, verbose_name='汽车名')
color = models.IntegerField(choices=COLOR_CHOICES, default=0, verbose_name='颜色')
price = models.DecimalField(max_digits=9, decimal_places=2, verbose_name='价格表')
img = models.ImageField(upload_to='img', default='img/default.png', verbose_name='汽车图片')
store = models.ForeignKey(to=CarStore, related_name='cars', db_constraint=False, on_delete=models.DO_NOTHING,
null=True)
sponsor = models.ManyToManyField(to=CarSponsor, related_name='cars', db_constraint=False, )
@property
def color_car(self):
return self.get_color_display()
@property
def image(self):
from django.conf import settings
return '%s%s%s' % (settings.BASE_URL, settings.MEDIA_URL, self.img)
@property
def store_info(self):
return {
'name': self.store.name,
'address': self.store.address,
}
@property
def sponsor_list(self):
sponsor_list_tmp = [] # 存放所有赞助商格式化数据列表
sponsors = self.sponsor.all() # 所有赞助商
for sponsor in sponsors:
aponsor_dic = {
'name': sponsor.name
}
try:
aponsor_dic['mobile'] = sponsor.detail.mobile
except:
aponsor_dic['mobile'] = '无'
sponsor_list_tmp.append(aponsor_dic) # 将处理过的数据添加到数据列表中
return sponsor_list_tmp
class Meta:
verbose_name_plural = '汽车表'
def __str__(self):
return self.name
from rest_framework import serializers
from . import models
# 序列化补充
class CarListSerializer(serializers.ListSerializer):
# 自定义的群增改辅助类,没必要重新写create方法
def create(self, validated_data):
return super().create(validated_data)
# 自定义群改,辅助类
def update(self, instance_list, validated_data_list):
return [
self.child.update(instance_list[index], attrs) for index, attrs in enumerate(validated_data_list)
]
# 汽车表序列化
class CarModelSerializer(serializers.ModelSerializer):
class Meta:
# list_serializer_class固定写法,内部方法
list_serializer_class = CarListSerializer
model = models.Car
fields = ['name', 'color', 'price', 'img', 'color_car', 'image', 'store', 'sponsor', 'store_info',
'sponsor_list']
extra_kwargs = {
'color_car': {
'read_only': True
},
'image': {
'read_only': True
},
'sponsor': {
'read_only': True
}
}
# 汽车商家表序列化
class CarStoreModelSerializer(serializers.ModelSerializer):
class Meta:
list_serializer_class = CarListSerializer
model = models.CarStore
fields = ['name', 'address', ]
# extra_kwargs = {
#
# 'car_info': {
# 'read_only': True
# }
# }
from rest_framework.views import APIView
from rest_framework.response import Response
from . import models, serializers
from .response import APIResponse
# Create your views here.
class CarAPIView(APIView):
def get(self, request, *args, **kwargs):
pk = kwargs.get('pk')
if pk:
car_obj = models.Car.objects.filter(is_delete=False, pk=pk).first()
car_ser = serializers.CarModelSerializer(car_obj)
else:
car_obj = models.Car.objects.filter(is_delete=False).all()
print(car_obj)
car_ser = serializers.CarModelSerializer(car_obj, many=True)
return APIResponse(status=car_ser.data)
def delete(self, request, *args, **kwargs):
'''
单删:接口:/books/(pk)/
群删:接口/books/
逻辑:修改is_delete字段,修改成功代表删除成功,修改失败代表删除失败
'''
pk = kwargs.get('pk')
if pk:
pks = [pk]
else:
pkl = request.data
pks = []
for i in pkl:
x = i.get('id')
pks.append(x)
try:
rows = models.Car.objects.filter(is_delete=False, pk__in=pks).update(is_delete=True)
except:
return APIResponse(1, '数据有误')
if rows:
return APIResponse(0, '删除成功')
return APIResponse(1, '删除失败')
def post(self, request, *args, **kwargs):
'''
单增:接口/cars/(pk)/
群增:接口/cars/
逻辑:将数据给系列化处理,数据的类型关系many的属性是否为True
'''
if isinstance(request.data, dict):
many = False
elif isinstance(request.data, list):
many = True
else:
return Response(data={'detail': '数据有误'}, status=400)
car_ser = serializers.CarModelSerializer(data=request.data, many=many)
car_ser.is_valid(raise_exception=True)
car_object_or_list = car_ser.save()
return APIResponse(results=serializers.CarModelSerializer(car_object_or_list, many=many).data)
def patch(self, request, *args, **kwargs):
pk = kwargs.get('pk')
if pk: # 单改
try:
car_instance = models.Car.objects.get(is_delete=False, pk=pk)
except:
return Response({'detail': 'pk error'}, status=400)
car_ser = serializers.CarModelSerializer(instance=car_instance, data=request.data, partial=True)
car_ser.is_valid(raise_exception=True)
car_obj = car_ser.save()
return APIResponse(results=serializers.CarModelSerializer(car_obj).data)
else: # 群改
request_data = request.data
try:
pks = []
for dic in request_data:
pk = dic.pop('id')
pks.append(pk)
print(pks)
car_query = models.Car.objects.filter(is_delete=False, pk__in=pks).all()
if len(pks) != len(car_query):
raise Exception('pk对应的数据不存在')
except Exception as e:
return Response({'detail': '%s' % e}, status=400)
car_ser = serializers.CarModelSerializer(instance=car_query, data=request_data, many=True, partial=True)
car_ser.is_valid(raise_exception=True)
car_list = car_ser.save()
return APIResponse(results=serializers.CarModelSerializer(car_list, many=True).data)
class CarStoreAPIView(APIView):
def get(self, request, *args, **kwargs):
pk = kwargs.get('pk')
if pk:
car_obj = models.CarStore.objects.filter(is_delete=False, pk=pk).first()
car_ser = serializers.CarStoreModelSerializer(car_obj)
else:
car_obj = models.CarStore.objects.filter(is_delete=False).all()
car_ser = serializers.CarStoreModelSerializer(car_obj, many=True)
return APIResponse(status=car_ser.data)
def delete(self, request, *args, **kwargs):
pk = kwargs.get('pk')
if pk:
pks = [pk]
else:
pkl = request.data
pks = []
for i in pkl:
pk = i.get('id')
pks.append(pk)
try:
rows = models.CarStore.objects.filter(is_delete=False, pk__in=pks).update(is_delete=True)
except:
return APIResponse(1, '数据有误')
if rows:
return APIResponse(0, '删除成功')
else:
return APIResponse(1, '删除失败')
def post(self, request, *args, **kwargs):
if isinstance(request.data, dict):
many = False
elif isinstance(request.data, list):
many = True
else:
return Response(data={'detail': '数据有误'}, status=400)
carstore_ser = serializers.CarStoreModelSerializer(data=request.data, many=many)
carstore_ser.is_valid(raise_exception=True)
carstore_object_or_list = carstore_ser.save()
return APIResponse(status=serializers.CarStoreModelSerializer(carstore_object_or_list, many=many).data)
def patch(self, request, *args, **kwargs):
pk = kwargs.get('pk')
if pk:
try:
car_store = models.CarStore.objects.filter(is_delete=False, pk=pk)
except:
return Response({'detail': 'pk error'}, status=400)
car_store_ser = serializers.CarStoreModelSerializer(instance=car_store, data=request.data, partial=True)
car_store_ser.is_valid(raise_exception=True)
car_store_obj = car_store_ser.save()
return APIResponse(results=serializers.CarStoreModelSerializer(car_store_obj).data)
else:
request_data = request.data
try:
pks = []
for dic in request_data:
pk = dic.pop('id')
pks.append(pk)
car_store_query = models.CarStore.objects.filter(is_delete=False, pk__in=pks).all()
if len(pks) != len(car_store_query):
raise Exception('PK对应的数据不存在')
except Exception as e:
return Response({'detail': '%s' % e}, status=400)
car_store_ser = serializers.CarStoreModelSerializer(instance=car_store_query, data=request_data, many=True,
partial=True)
car_store_ser.is_valid(raise_exception=True)
car_store_list = car_store_ser.save()
return APIResponse(results=serializers.CarStoreModelSerializer(car_store_list, many=True).data)
标签:inf you try rac 灰色 model 字段 time related
原文地址:https://www.cnblogs.com/mqhpy/p/12115990.html