serializers.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. # coding=utf-8
  2. from django.conf import settings
  3. from rest_framework import serializers
  4. from apps.store.models import Shop, StoreBrand
  5. from apps.images.models import Images
  6. from apps.vehicle.models import Brand
  7. from utils.exceptions import CustomError
  8. class ShopSerializer(serializers.ModelSerializer):
  9. enabled_text = serializers.SerializerMethodField()
  10. img_url = serializers.SerializerMethodField()
  11. brands = serializers.SerializerMethodField()
  12. brand_text = serializers.SerializerMethodField()
  13. def get_enabled_text(self, obj):
  14. if obj.enabled:
  15. return u'是'
  16. return u'否'
  17. def get_img_url(self, obj):
  18. if obj.img:
  19. return '%s%s' % (settings.MEDIA_URL, obj.img.picture)
  20. return ''
  21. def get_brands(self, obj):
  22. brand_rows = StoreBrand.objects.filter(store=obj)
  23. if brand_rows.count() > 0:
  24. return [brand_row.brand_id for brand_row in brand_rows]
  25. return []
  26. def get_brand_text(self, obj):
  27. brand_rows = StoreBrand.objects.filter(store=obj)
  28. data = []
  29. for brand_row in brand_rows:
  30. data.append(brand_row.brand.name)
  31. return ','.join(data)
  32. class Meta:
  33. model = Shop
  34. fields = '__all__'
  35. def create(self, validated_data):
  36. user = self.context['request'].user
  37. file = self.context['request'].FILES.get('image', None)
  38. if file:
  39. validated_data['img'] = Images.objects.employee_addnew(user, Images.SHOP_FILE, file)
  40. instance = super(ShopSerializer, self).create(validated_data)
  41. brands = self.context['request'].data.get('brands')
  42. if brands:
  43. brands = brands.split(',')
  44. for item in brands:
  45. brand = Brand.objects.filter(id=int(item), enabled=True, delete=False).first()
  46. if not brand:
  47. raise CustomError(u'所选择的品牌不存在或不可用或已被删除')
  48. StoreBrand.objects.create(store=instance, brand=brand)
  49. return instance