Reputation: 747
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
Upvotes: 0
Views: 3605
Reputation: 722
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
related_name
in Family
model.source
in MyUserSerializer
Upvotes: 2
Reputation: 88499
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
Upvotes: 1