1

I have following DB Structure with 3 tables as following

Table Persons

Id  U_id    PersonName
101 12       Iron Man
201 12       Spider Man
301 15       Thanos

Table EarnTypes

Id  U_id    TypeEarning
10  12       Salary
20  15       Lottery
30  15       Gambling

Table EarningsEntry

ID     U_Id P_Id    EarnType_Name   Earn_Amt    Earn_Date
1001    12  101         10           5$         8-Jun-2017
3001    15  301         20           25$        7-Apr-2018
4001    12  201         10           50$        19-Apr-2018

My List API View code is following i am filtering data based on logged in users only.

    class EarningEntryAPIView(mixins.CreateModelMixin,generics.ListAPIView):
        permission_classes      = [IsOwnerOnly]
        serializer_class        = EarningsSerializer
        #
        def get_queryset(self):
            request = self.request
            #print (request.user)
            qs = EarningsEntry.objects.filter(U_id=self.request.user)
            query = request.GET.get('q')
            if query is not None:
                qs = qs.filter(Earning_Type_id__EarningTypeName__contains=query)
            return qs

        def post(self,request,*args,**kwargs):
            return self.create(request,*args,**kwargs)

        def perform_create(self, serializer):
            serializer.save(id=self.request.user)

My EarningEntry Model is as following.

def upload_file(instance, filename):
    return "earnings/{user}/{filename}".format(user=instance.id, filename=filename)


class EarningsQuerySet(models.QuerySet):
    def serialize(self):
        list_values = list(
            self.values('Id', 'U_id', 'P_id', 'Earning_Type_id', 'Ear_Amt', 'Ear_Img', 'Ear_date', 'Ear_comm'))
        print(list_values)
        return json.dumps(list_values, sort_keys=True, indent=1, cls=DjangoJSONEncoder)


class EarningssManager(models.Manager):
    def get_queryset(self):
        return EarningsQuerySet(self.model, using=self._db)


# Create your models here.
class EarningsEntry(models.Model):
    Id = models.AutoField(primary_key=True)
    U_id=models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    P_id =models.ForeignKey(personmodel.Person,on_delete=models.CASCADE)
    Earning_Type_id = models.ForeignKey(eartypemodel.EarningTypes,on_delete=models.CASCADE)
    Ear_Amt = models.FloatField(null=False,blank=False)
    Ear_Img = models.ImageField(null=True,blank=True)
    Ear_date = models.DateField("ExpenseDate",null=False,blank=False)
    Ear_comm = models.TextField()
    objects = EarningssManager()

    def __str__(self):
        return str(self.U_id) + str(self.P_id) + str(self.Ear_Amt) + str(self.Ear_Img) +str(self.Ear_Img)+str(self.Earning_Type_id)+ \
               str(self.Ear_date) + str(self.Ear_comm) + str(self.Id) or ""

    def serialize(self):
        data={
            'Id': self.Id,
            'U_id': self.U_id,
            'P_id': self.P_id,
            'Earning_Type_id': self.Earning_Type_id,
            'Ear_Amt': self.Ear_Amt,
            'Ear_Img': self.Ear_Img,
            'Ear_date': self.Ear_date,
            'Ear_comm': self.Ear_comm
        }
        data = json.dumps(data,sort_keys=True,indent=1,cls=DjangoJSONEncoder)
        return data


    @property
    def owner(self):
        return self.Id

Now when i try to browse api for insert or list view i get all values for U_id ,P_id and Earnig_Type_id foreign key references which is not right.

How can i filter that based on only my logged in user.In my current view i am viewing everything.

Please refer to this screen where nirav and nirav13 are two different users. enter image description here

1 Answer 1

4

first of all, do not name the fields with capital letters. second, don't put '_id' in the name of the foreign keys, take a look at django docs. anyway, you should override __init__ and filter the queryset for those fields:

class EarningsSerializer(serializer.Modelserializer):
    def __init__(self, *args, **kwargs):
        super(EarningsSerializer, self).__init__(*args, **kwargs)
        request_user = self.context['request'].user
        self.fields['P_id'].queryset = Person.objects.filter(U_id=request_user)
        self.fields['Earning_Type_id'].queryset = EarningTypes.objects.filter(U_id=request_user)
Sign up to request clarification or add additional context in comments.

1 Comment

You are awesome man thank you very very much for your swift response and i do agree with your point which mention that do not ID in column name .

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.