问题描述
我需要按过去的目标过滤所有专家。
我在 https://github.com/morenoh149/django-rest-datatables-relations-example 有一个最小的可运行示例(顺便说一句,您可以使用测试数据加载一些装置)。
我的模型是
class Expert(models.Model):
name = models.CharField(blank=True,max_length=300)
class Meeting(models.Model):
user = models.ForeignKey(User,on_delete=models.SET_NULL,blank=True,null=True)
expert = models.ForeignKey(Expert,null=True)
objective = models.TextField(null=True,blank=True)
我的数据表 javascript
$("#table-analyst-search").DataTable({
serverSide: true,ajax: "/api/experts/?format=datatables",ordering: false,pagingType: "full_numbers",responsive: true,columns: [
{
data: "objectives",name: "objectives",visible: false,searchable: true,render: (objectives,type,row,Meta) => {
return objectives;
}
},],});
我的序列化器
class ExpertSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(read_only=True)
objectives = serializers.SerializerMethodField()
class Meta:
model = Expert
fields = (
"id","objectives",)
def get_objectives(self,obj):
request = self.context["request"]
request = self.context["request"]
meetings = Meeting.objects.filter(
analyst_id=request.user.id,expert_id=obj.id
).distinct('objective')
if len(meetings) > 0:
objectives = meetings.values_list("objective",flat=True)
objectives = [x for x in objectives if x]
else:
objectives = []
return objectives
当我开始在 datatables.js 搜索栏中输入时,我收到类似的错误
FieldError at /api/experts/
Cannot resolve keyword 'objectives' into field. Choices are: bio,company,company_id,created_at,description,email,favoriteexpert,first_name,id,is_blocked,last_name,meeting,middle_name,network,network_id,position,updated_at
Request Method: GET
Request URL: http://localhost:8000/api/experts/?format=datatables&draw=3&columns%5B0%5D%5Bdata%5D=tags&columns%5B0%5D%5Bname%5D=favoriteexpert.tags.name&columns%5B0%5D%5Bsearchable%5D=true&columns%5B0%5D%5Borderable%5D=false&columns%5B0%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B0%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B1%5D%5Bdata%5D=desc&columns%5B1%5D%5Bname%5D=&columns%5B1%5D%5Bsearchable%5D=false&columns%5B1%5D%5Borderable%5D=false&columns%5B1%5D%5Bsearch%5D%5Bvalue%5D=&columns%
fwiw,在纯 django orm 中,我想要完成的事情就像
Expert.objects.filter(
pk__in=Meeting.objects.filter(
objective__icontains='Plastics',user=request.user
).values('expert')
)
如何按历史会议目标过滤专家?
解决方法
错误的原因是 django-rest-framework-datatables
正在尝试将请求转换为可以针对 Expert
表运行的查询。
在您的 JS 中,您要求返回一个名为“目标”的字段,但 Expert
模型中没有这样的字段。
您可能可以使用 django-filter
integration 实现您想要做的事情。在这种情况下,您可以对 Meeting
表的 FK 引用设置过滤器。 example app 演示了如何执行此操作。
我认为了解正在发生的事情的最好方法是让示例应用程序运行,如果可能,设置断点并逐步执行。
顺便说一句,如果您想让搜索框正常工作,那么您需要定义一个 global_q()
方法。示例应用中也涵盖了这一点。
我最终编写了一个自定义的 django 过滤器
df = pd.concat([df[i].str.split('\n',expand=True) for i in df.columns],axis=1)
df.columns = ['c{}'.format(i) for i in range(1,9)]
完整示例位于 https://github.com/morenoh149/django-rest-datatables-relations-example