I'm designing an api using python DRF for a merchant profile page. ID should not be required to be passed into the api.
I'm trying to do a simple fetch to get one object to return as a result and I read that retrieve can be used for this function.
So here's my code:
models.py:
# Create your models here.
class Merchant(models.Model):
uuid = models.UUIDField(default=uuid.uuid4, editable=False, db_index=True)
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
def __str__(self):
return self.merchantprofile.organization_name
class MerchantProfile(models.Model):
uuid = models.UUIDField(default=uuid.uuid4, editable=False, db_index=True)
merchant = models.OneToOneField(Merchant, on_delete=models.CASCADE)
organization_name = models.CharField(max_length=255)
since = models.DateTimeField(auto_now_add=True)
mobile_number = models.CharField(max_length=20, null=True, blank=True)
email = models.EmailField(null=True, blank=True)
website_url = models.CharField(max_length=100, null=True, blank=True)
views.py:
class MerchantProfileViewSet(AuthenticationMixin, RetrieveModelMixin, ListModelMixin, UpdateModelMixin, GenericViewSet):
queryset = MerchantProfile.objects.all()
serializer_class = MerchantProfileSerializer
lookup_field = "uuid"
def retrieve(self, request, *args, **kwargs):
user_id = self.request.user.id
instance = MerchantProfile.objects.get(merchant__user=user_id)
serializer = MerchantProfileSerializer(instance)
return Response(serializer.data, status=status.HTTP_200_OK)
urls.py:
merchant_router = DefaultRouter()
merchant_router.register('/profile', MerchantProfileViewSet, basename="merchantprofile")
urlpatterns = [
path('merchant', include(merchant_router.urls)),
]
serializer.py
class MerchantProfileSerializer(serializers.ModelSerializer):
class Meta:
model = MerchantProfile
fields = ["organization_name", 'since', 'mobile_number', 'email', 'website_url',
'facebook_url', 'instagram_url', 'tiktok_url', 'youtube_url', 'xhs_url']
No matter how I tweaked, I always get this
but this is how I want it to look like ( I managed to get this by using list method, but I was told that I should be able to achieve with retrieve and retrieve should be the way to go instead of using list which is a workaround in this particular case)
def list(self, request):
user_id = self.request.user.id
try:
qs = MerchantProfile.objects.get(merchant__user=user_id)
serializer = self.serializer_class(qs)
return Response(serializer.data, status=status.HTTP_200_OK)
except:
raise Http404("Merchant profile does not exist for the current user")
Would appreciate if someone can point out my mistakes and give me some guidance since I am very new to this, thank you!

