Skip to content

Instantly share code, notes, and snippets.

@Tushant
Created August 13, 2017 14:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Tushant/b9fbb3d40c3a7bcc0438529740f961bb to your computer and use it in GitHub Desktop.
Save Tushant/b9fbb3d40c3a7bcc0438529740f961bb to your computer and use it in GitHub Desktop.
class OpeningHours(models.Model):
store = models.ForeignKey('Store', related_name="opening_hour")
weekday = models.CharField(choices=DAY, max_length=12)
opening_hour = models.TimeField()
closing_hour = models.TimeField()
class Meta:
verbose_name = 'Opening Hour'
verbose_name_plural = 'Opening Hours'
def ___str__(self):
return '{} {} - {}'.format(self.weekday, str(self.opening_hour), str(self.closing_hour))
class Store(models.Model):
merchant = models.ForeignKey(User, blank=True, null=False)
token = models.CharField(default=token_generator, max_length=20, unique=True, editable=False)
name_of_legal_entity = models.CharField(max_length=250, blank=False, null=False)
pan_number = models.CharField(max_length=20, blank=False, null=False)
registered_office_address = models.CharField(max_length=200)
name_of_store = models.CharField(max_length=100)
email = models.EmailField(blank=False, null=False)
store_contact_number = models.PositiveIntegerField(blank=False, null=False)
is_active = models.BooleanField(default=True)
class EagerLoadingMixin:
@classmethod
def setup_eager_loading(cls, queryset):
if hasattr(cls, "_SELECT_RELATED_FIELDS"):
queryset = queryset.select_related(*cls._SELECT_RELATED_FIELDS)
if hasattr(cls, "_PREFETCH_RELATED_FIELDS"):
queryset = queryset.prefetch_related(*cls._PREFETCH_RELATED_FIELDS)
return queryset
class ProductImageSerializer(serializers.ModelSerializer):
class Meta:
model = ProductImage
fields = "__all__"
read_only_fields = ('updated', )
class OpeningHoursSerializer(serializers.ModelSerializer):
class Meta:
model = OpeningHours
fields = "__all__"
class ProductSerializer(serializers.ModelSerializer, EagerLoadingMixin):
# _PREFETCH_RELATED_FIELDS = ['image',]
class Meta:
model = Product
exclude = ('is_active', )
class StoreSerializer(serializers.ModelSerializer, EagerLoadingMixin):
_SELECT_RELATED_FIELDS = ['merchant', ]
# product = ProductSerializer(many=True)
opening_hour = OpeningHoursSerializer(many=True)
id = serializers.CharField(source='token', read_only=True)
class Meta:
model = Store
exclude = ('is_active', )
class StoreView(APIView):
serializer_class = StoreSerializer
def get(self, request, token=None, format=None):
"""
Return a list of all stores.
"""
reply = {}
try:
stores = Store.objects.all()
if token:
store = stores.get(token=token)
reply['data'] = self.serializer_class(store).data
reply['data'] = self.serializer_class(stores, many=True).data
except:
reply['data'] = []
return Response(reply, status.HTTP_200_OK)
def post(self, request, format=None):
"""
Post store
"""
store = None
reply={}
if not token is None:
try:
store = Store.objects.get(token=token)
except Store.DoesNotExist:
return error.RequestedResourceNotFound().as_response()
except:
return error.UnknownError().as_response()
serialized_data = self.serializer_class(instance=store, data=request.data, partial=True)
if serialized_data.is_valid():
serialized_data.save(merchant=request.user)
else:
return error.ValidationError(serialized_data.errors).as_response()
return self.get(request)
@vaibhav-jain
Copy link

Hey your StoreView should inherit CreateModelMixin and ListModelMixin along with GenericModelViewSet

@vaibhav-jain
Copy link

Why you are using APIView ?

@Tushant
Copy link
Author

Tushant commented Aug 14, 2017

@vaibhav-jain I am using APIView for custom error response. This is my first time. How would you do the StoreView in best way? Could you please show me an example of better version of api from my code?

@vaibhav-jain
Copy link

Sure just give me few hours. I'm traveling right now.

@Tushant
Copy link
Author

Tushant commented Aug 14, 2017

yeah sure @vaibhav-jain

@vaibhav-jain
Copy link

Hey I don't see any custom response. All of the above can be done using DRF generic View's.

@vaibhav-jain
Copy link

Use the above for reference.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment