0

Does anyone know how to get userprofile detials from 'PersonalDetails' through by using the User table

Modal Connection flow

User -> Representative -> PersonalDetails

Retrive data flows

User <- Representative <- PersonalDetails

Models.py

class User(AbstractBaseUser, PermissionsMixin, BaseFields):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255, blank=True)
     representative =  models.ForeignKey(Representative,blank=True,null=True,on_delete=models.SET_NULL)

class Representative(BaseFields):
    personal_details = models.ForeignKey(PersonalDetails,on_delete=models.CASCADE)
    role=models.CharField(max_length=250,blank=True,null=True)

class PersonalDetails(models.Model):
    name_en = models.CharField(max_length=250)
    dob = models.DateField()

Serializer.py

class UserProfileSerializer(ModelSerializer):
    class Meta:
        model = User
        fields = ('id','representative')

Views.py

class UserProfileDetailView(RetrieveUpdateAPIView):
    http_method_names = ['get']
    permission_classes = [AllowAny,]
    queryset = PersonalDetails.objects.all()
    serializer_class = UserProfileSerializer
    def get(self, *args, **kwargs):
        data = {}
        user = User.objects.get(id=kwargs.get('pk'))
        representative_id  = user.representative
        personal_details_id = Representative.objects.get(id=representative_id.id)
        personal_details = PersonalDetails.objects.get(id=personal_details_id.id)
        if personal_details:
            serializer = UserProfileSerializer(personal_details)
            return Response(serializer.data,status.HTTP_200_OK) 
Jerin Raju
  • 43
  • 6

1 Answers1

1

It's possible with related_name parameter in ForeignKey field:

class User(AbstractBaseUser, PermissionsMixin, BaseFields):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255, blank=True)
    representative = models.ForeignKey(Representative, blank=True, null=True, on_delete=models.SET_NULL, related_name="representative")

class Representative(BaseFields):
    personal_details = models.ForeignKey(PersonalDetails, on_delete=models.CASCADE, related_name="personal_details")
    role=models.CharField(max_length=250, blank=True, null=True)

class PersonalDetails(models.Model):
    name_en = models.CharField(max_length=250)
    dob = models.DateField()

Also, check this answer too.

Bootuz
  • 530
  • 3
  • 6
  • 16