django - Django Rest Framework过滤器使用外键
问题描述
我有以下 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
我的列表 API 视图代码如下,我仅根据登录用户过滤数据。
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 外键引用的所有值,这是不正确的。
我如何仅根据我的登录用户过滤它。在我当前的视图中,我正在查看所有内容。
解决方案
首先,不要用大写字母命名字段。其次,不要在外键名称中加上'_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)
推荐阅读
- laravel - 如何为 axios 设置 URL?
- python - 'list' 对象没有属性 'id'
- java - 您如何在代理后面使用 spring-security OAuth2,但仅将 ForwardedHeaderTransformer 用于 OAuth 组件
- java - Java JButton 两个或多个图标
- javascript - 如何在javascript中编写字符串和回显的比较代码?
- poco-libraries - 我如何知道 FileInputStream 是否打开了文件?
- c - 在 glibc <= 2.23 中,为什么在 mutex_lock 宏中使用 `0;`?
- django - Django 管理员在主机站点上没有响应
- google-apps-script - 使用 Google Web App URL 参数作为函数的一部分
- mongodb - MongoDB 集合 toArray() 长度比 collection.count() 少 20