【问题标题】:django rest datatables, filter experts by meeting objectivesdjango rest 数据表,通过满足目标过滤专家
【发布时间】:2021-05-22 23:10:02
【问题描述】:

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

我在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, on_delete=models.SET_NULL, blank=True, 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 django-rest-framework datatables


    【解决方案1】:

    错误的原因是django-rest-framework-datatables 试图将请求转换为可以针对Expert 表运行的查询。

    在您的 JS 中,您要求返回一个名为“objectives”的字段,但 Expert 模型上没有这样的字段。

    您可能可以使用django-filter integration 实现您想要做的事情。在这种情况下,您可以对 Meeting 表的 FK 引用设置过滤器。 example app 演示了如何执行此操作。

    我认为了解正在发生的事情的最佳方式是让示例应用程序运行,如果可能,设置断点并逐步执行。

    顺便说一句,如果你想让搜索框正常工作,那么你需要定义一个global_q() 方法。这也包含在示例应用程序中。

    【讨论】:

      【解决方案2】:

      我最终创作了一个自定义 django-filter

      class AssociatedMeetingCharFilter(filters.CharFilter):
          def global_q(self):
              """
              Uses the global filter to search a meeting field of meetings owned by the logged in user
              """
              if not self._global_search_value:
                  return Q()
              kw = "meeting__{}__{}".format(self.field_name, self.lookup_expr)
              return Q(**{
                  kw: self._global_search_value,
                  "meeting__user_id": self.parent.request.user.id or -1,
              })
      
      
      class ExpertGlobalFilterSet(DatatablesFilterSet):
          name = GlobalCharFilter(lookup_expr='icontains')
          objectives = AssociatedMeetingCharFilter(field_name='objective', lookup_expr='icontains')
      

      https://github.com/morenoh149/django-rest-datatables-relations-example 上的完整示例

      【讨论】:

        猜你喜欢
        • 2017-12-28
        • 2016-01-14
        • 1970-01-01
        • 2013-11-30
        • 2018-08-18
        • 2017-07-13
        • 2018-12-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多