Created
August 13, 2017 14:27
-
-
Save Tushant/b9fbb3d40c3a7bcc0438529740f961bb to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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', ) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
Why you are using APIView ?
@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?
Sure just give me few hours. I'm traveling right now.
yeah sure @vaibhav-jain
Hey I don't see any custom response. All of the above can be done using DRF generic View's.
Use the above for reference.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hey your StoreView should inherit CreateModelMixin and ListModelMixin along with GenericModelViewSet