【问题标题】:Django Rest Framework Filter using foreign KeyDjango Rest Framework过滤器使用外键
【发布时间】:2019-02-12 20:22:17
【问题描述】:

我有以下 3 个表的数据库结构,如下所示

桌人

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

表 EarnTypes

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

表收入条目

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

我的 List API View 代码如下,我仅根据登录用户过滤数据。

    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)

我的 EarningEntry 模型如下。

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

现在,当我尝试浏览 api 以获取插入或列表视图时,我得到了 U_id 、P_id 和 Earnig_Type_id 外键引用的所有值,这是不正确的。

如何仅根据我的登录用户进行过滤。在我当前的视图中,我正在查看所有内容。

请参阅此屏幕,其中 nirav 和 nirav13 是两个不同的用户。

【问题讨论】:

    标签: django django-models django-rest-framework django-filter


    【解决方案1】:

    首先,不要用大写字母命名字段。第二,不要在外键名中加上'_id',看看django docs。无论如何,您应该覆盖 __init__ 并过滤这些字段的查询集:

    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)
    

    【讨论】:

    • 你是个了不起的人,非常感谢你的迅速反应,我同意你的观点,即不要在列名中添加 ID。
    猜你喜欢
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 2013-10-24
    相关资源
    最近更新 更多