0

In my model, i have a family table where user are able to enter their family details and store their information. But how do i get/query all the family member based on current userId ?

For eg: userId=1 added 2 family member, mother and father. How do i get these 2 family member based on the query of the current user's userId ?

here is my code :

models

class MyUser(AbstractUser):
    userId = models.AutoField(primary_key=True)
    gender = models.CharField(max_length=6, blank=True, null=True)
    nric = models.CharField(max_length=40, blank=True, null=True)
    birthday = models.DateField(blank=True, null=True)
    birthTime = models.TimeField(blank=True, null=True)

class Family(models.Model):
    userId = models.ForeignKey(MyUser)
    relationship = models.CharField(max_length=100)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    gender = models.CharField(max_length=6, blank=True, null=True)

serializers

class MyUserSerializer(serializers.ModelSerializer):
    valid_time_formats = ['%H:%M', '%I:%M%p', '%I:%M %p']
    birthTime = serializers.TimeField(format='%I:%M %p', input_formats=valid_time_formats, allow_null=True, required=False)

    class Meta:
        model = MyUser
        fields = ['userId', 'username', 'email', 'first_name', 'last_name', 'gender', 'nric', 'birthday', 'birthTime']
        read_only_fields = ('userId',)
        extra_kwargs = {"password": {"write_only": True}}

    def update(self, instance, validated_data):
        for attr, value in validated_data.items():
            if attr == 'password':
                instance.set_password(value)
            else:
                setattr(instance, attr, value)
        instance.save()
        return instance


class FamilySerializer(serializers.ModelSerializer):

    class Meta:
        model = Family
        fields = ('id', 'userId', 'first_name', 'last_name', 'gender', 'relationship')

views

class MyUserViewSet(viewsets.ModelViewSet):
    permission_classes = [AllowAny]
    queryset = MyUser.objects.all()
    serializer_class = MyUserSerializer
    filter_backends = (filters.SearchFilter,)
    search_fields = ('=userId', 'username', 'email', 'first_name', 'last_name')


class FamilyViewSet(viewsets.ModelViewSet):
    permission_classes = [AllowAny]
    queryset = Family.objects.all()
    serializer_class = FamilySerializer


def get_object(self, *args, **kwargs):
    return self.request.user

def perform_update(self, serializer):
    super(CurrentFamilyView, self).perform_update(serializer)
    user = serializer.instance
    if settings.SEND_ACTIVATION_EMAIL and not user.is_active:
        context = {'user': user}
        to = [MyUser(user)]
        email.ActivationEmail(self.request, context).send(to)

Can anyone help me with get current user's family

Jin Nii Sama
  • 707
  • 1
  • 16
  • 33

2 Answers2

2

You can try this:

class Family(models.Model):
    userId = models.ForeignKey(MyUser, related_name='user_family')
    relationship = models.CharField(max_length=100)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    gender = models.CharField(max_length=6, blank=True, null=True)

serializers.py

class FamilySerializer(serializers.ModelSerializer):

    class Meta:
        model = Family
        fields = ('id', 'first_name', 'last_name', 'gender', 'relationship')


class MyUserSerializer(serializers.ModelSerializer):

    valid_time_formats = ['%H:%M', '%I:%M%p', '%I:%M %p']
    birthTime = serializers.TimeField(format='%I:%M %p', input_formats=valid_time_formats, allow_null=True, required=False)
    my_family = FamilySerializer(many=True, source='user_family')

    class Meta:
        model = MyUser
        fields = ('userId', 'username', 'email', 'first_name', 'last_name', 'gender', 'nric', 'birthday', 'birthTime', 'my_family')
        read_only_fields = ('userId',)
        extra_kwargs = {"password": {"write_only": True}}

MyUserSerializer now will show userid related family members. If you want to get current user family member you need to overwrite get_queryset method.

your views.py:

class MyUserViewSet(viewsets.ModelViewSet):

    serializer_class = MyUserSerializer
    get_queryset(self):
        return  MyUser.objects.get(id=self.request.user.id)

Now the view will return current user family members.

Updates

  1. Added related_name in Family model.
  2. Added source in MyUserSerializer
mohammadjh
  • 722
  • 5
  • 12
  • Glad to help :) – mohammadjh Jan 03 '18 at 10:21
  • Ah sorry, i got an error when viewing the page due to not double checking. I have a few question, In the family serializer, do i remove userId ? And in the views.py `MyUserViewSet`, i use id instead of userId ? – Jin Nii Sama Jan 04 '18 at 05:02
  • For `FamilySerializer`, you can keep or remove `userId` but I don't think there is any necessity to keep `userId`. In `MyUserViewSet` use `userId` or `pk` instead of `id`. – mohammadjh Jan 04 '18 at 07:09
  • Now i got this error `'MyUser' object has no attribute 'my_family'.` Do i have to create the 'my_family' field in MyUser model ? Sorry for all these trouble – Jin Nii Sama Jan 04 '18 at 07:24
  • the userId in Family models is different than the id in Family in serializer, correct ? userId = current user, id = id of family OR userId = familyId ? – Jin Nii Sama Jan 04 '18 at 08:38
  • Yes, the `id` in `FamilySerializer` is for `id` of `Family` model. and ` userId = current user id`. – mohammadjh Jan 04 '18 at 09:13
  • Tested and check, it works nicely now. Thanks. For the Family serializer, how to set the userId=self.request.user ? As it is to allow only the current user to add their own family – Jin Nii Sama Jan 04 '18 at 09:46
  • 1
    It would be better if you give some time to study on DRF doc. You will learn a lot from it. – mohammadjh Jan 04 '18 at 10:15
1

Let's assume we have a user with id=1

usr = MyUser.objects.get(id=1)
usr_famly = usr.family_set.values()

usr_famly will have all family data related to user with id=1

JPG
  • 82,442
  • 19
  • 127
  • 206