【问题标题】:What's the most efficient way to filter QuerySet to feed datatables?过滤 QuerySet 以提供数据表的最有效方法是什么?
【发布时间】:2015-07-24 07:12:15
【问题描述】:

为了使用django_datatables_view 过滤掉QuerySet 以提供datatables,我正在尝试覆盖方法get_initial_queryset,但不能itertools.chain 或想出一个明确的Q 对象表达式完成这项工作。

class Student(models.Model):
    identity = models.CharField(max_length=50, unique=True)
    name = models.TextField()
    age = models.IntegerField()

class Status(models.Model):
    student = models.ForeignKey('Student')
    status = models.TextField()
    time = models.DateTimeField()

所以要获取每个Student 的最新Status 并将它们实际合并/组合成一个QuerySet 对象以使其在django_datatables_view 中工作,我该怎么办?

【问题讨论】:

  • 您的 Status 模型中有两个 time = models.DateTimeField()
  • 抱歉,刚刚更正了。

标签: python django datatables


【解决方案1】:

好吧,我不确定这是否是最有效的,但你可以这样做(这是未经测试的):

students = Student.objects.all()
status_ids = []

for student in students:
    latest_status_id = Status.objects.filter(student=student) \
                                     .latest('time').id
    status_ids.append(latest_status_id)

latest_statuses = Status.objects.filter(pk__in=statues)

【讨论】:

    【解决方案2】:

    我的理解是你需要重写这两个函数:

    def get_initial_queryset(self):
        return Status.objects.select_related('student')
    
    def prepare_results(self, qs):
        json_data = []
        for item in qs:
            json_data.append([item.student, item.status])
        return json_data
    

    更多详情read the docs here.

    【讨论】:

    • 没这么简单。好吧,如果QuerySet 实例没有在get_initial_queryset 函数中返回,那么您基本上必须重写许多其他函数,包括get_context_dataorderingpagingprepare_results,这很麻烦,所以我正在寻找一种方法将这些 QuerySet 组合成一个 QuerySet
    • 对不起,我的错。将 get_initial_queryset 函数更改为返回查询集。您是对的,可能您需要根据您的详细要求覆盖更多功能。结合这些查询集是什么意思?
    猜你喜欢
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 2010-10-22
    相关资源
    最近更新 更多