serializers.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. # coding=utf-8
  2. import datetime
  3. from django.conf import settings
  4. from rest_framework import serializers
  5. from utils.exceptions import CustomError
  6. from apps.order.models import ShoppingCart, Order, OrderDetails
  7. from apps.base import Formater
  8. class ShoppingCartSerializer(serializers.ModelSerializer):
  9. name = serializers.CharField(source='commodity_details.name', read_only=True)
  10. image = serializers.SerializerMethodField()
  11. price = serializers.SerializerMethodField()
  12. point_price = serializers.CharField(source='commodity_details.point_price', read_only=True)
  13. price_type = serializers.CharField(source='commodity_details.type', read_only=True)
  14. class Meta:
  15. model = ShoppingCart
  16. fields = '__all__'
  17. def get_price(self, obj):
  18. return Formater.formatValueShow(obj.commodity_details.price)
  19. def get_image(self, obj):
  20. if obj.commodity_details and obj.commodity_details.show_image:
  21. return obj.commodity_details.show_image.get_path()
  22. return ''
  23. def validate(self, attrs):
  24. if 'quantity' in attrs:
  25. try:
  26. quantity = int(attrs['quantity'])
  27. except:
  28. raise CustomError(u'商品数量错误,请修改!')
  29. if quantity <= 0:
  30. raise CustomError(u'商品数量错误,请修改!')
  31. if 'commodity_details' in attrs:
  32. if attrs['commodity_details'].delete:
  33. raise CustomError(u'该商品已删除,禁止购买!')
  34. if attrs['commodity_details'].status == settings.OFFLINE:
  35. raise CustomError(u'该商品已下架,禁止购买!')
  36. return attrs
  37. def create(self, validated_data):
  38. validated_data['customer'] = self.context['request'].customer
  39. instance = ShoppingCart.objects.filter(commodity_details=validated_data['commodity_details'], customer=validated_data['customer']).first()
  40. if instance:
  41. instance.quantity += validated_data['quantity']
  42. instance.save()
  43. else:
  44. instance = super(ShoppingCartSerializer, self).create(validated_data)
  45. return instance
  46. class OderSerializer(serializers.ModelSerializer):
  47. class Meta:
  48. model = Order
  49. fields = '__all__'
  50. def create(self, validated_data):
  51. validated_data['customer'] = self.context['request'].customer
  52. instance = super(OderSerializer, self).create(validated_data)
  53. return instance
  54. class OderSimpleSerializer(serializers.ModelSerializer):
  55. total_amount = serializers.SerializerMethodField()
  56. total_point = serializers.SerializerMethodField()
  57. status_text = serializers.CharField(source='get_status_display', read_only=True)
  58. details = serializers.SerializerMethodField()
  59. class Meta:
  60. model = Order
  61. fields = ('no', 'total_amount', 'total_point', 'status_text', 'details', 'id', 'name', 'tel', 'user_address', )
  62. def get_total_amount(self, obj):
  63. return Formater.formatValueShow(obj.total_amount)
  64. def get_total_point(self, obj):
  65. return '%.2f' % obj.total_point
  66. def get_details(self, obj):
  67. rows = OrderDetails.objects.filter(order=obj)
  68. serializer = OderDetailSimpleSerializer(rows, many=True)
  69. return serializer.data
  70. class OderDetailSimpleSerializer(serializers.ModelSerializer):
  71. name = serializers.CharField(source='commodity.name', read_only=True)
  72. show_image = serializers.SerializerMethodField()
  73. amount = serializers.SerializerMethodField()
  74. point_amount = serializers.SerializerMethodField()
  75. type = serializers.CharField(source='commodity.type', read_only=True)
  76. commodity_id = serializers.CharField(source='commodity.id', read_only=True)
  77. class Meta:
  78. model = OrderDetails
  79. fields = ('name', 'show_image', 'amount', 'point_amount', 'count', 'type', 'commodity_id', )
  80. def get_show_image(self, obj):
  81. if obj.commodity and obj.commodity.show_image:
  82. return obj.commodity.show_image.get_path()
  83. return ''
  84. def get_amount(self, obj):
  85. return Formater.formatValueShow(obj.amount)
  86. def get_point_amount(self, obj):
  87. return '%.2f' % obj.point_amount