django rest 数据表,通过满足目标过滤专家

问题描述

我需要按过去的目标过滤所有专家。

我在 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')
)

如何按历史会议目标过滤专家?

app and error message

解决方法

错误的原因是 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