如何有效地评估并从 Django 查询集中排除某些值?

问题描述 投票:0回答:1

我有一个模型,其中有 4 个日期时间字段(last_fed 是从用户输入中获取的,其他字段是在创建表单时生成的,为简洁起见,未在此处添加)。

class EatModel(models.Model):

    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    medicine = models.ForeignKey(MedicalInfo, on_delete=models.SET_NULL, null=True)
    interval = models.IntegerField(default=4)
    last_fed = models.DateTimeField(default=datetime.now)
    second_dose = models.DateTimeField(default=None, null=True)
    third_dose = models.DateTimeField(default=None, null=True)
    fourth_dose = models.DateTimeField(default=None, null=True)
    fifth_dose = models.DateTimeField(default=None, null=True)
    remarks = models.TextField(max_length=140, blank=True)
    complete = models.BooleanField(default=False)
    created = models.DateTimeField(auto_now_add=True)

我有一个通用的 TemplateView 显示器来输出结果以显示各种剂量。

class newlist(LoginRequiredMixin, TemplateView):
    
    template_name = 'trackerapp/eatmodel_newlist.html'
    login_url = 'eatlogin'
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['list'] = EatModel.objects.filter(user=self.request.user)
        return context

我想改进视图,以便不仅仅是将所有日期字段显示到模板中,我想评估它们中的每一个是否小于 localtime() ,如果是这样,我想从查询集中专门排除这些值(因此,如果我们超过了第二剂的日期时间,它只会传递到上下文第三剂和第四剂)

我用过滤器、排除、延迟、Q 进行了相当多的实验,但无法让它仍然返回行(更少不需要的值)。

我认为可行的一种方法是将其分成 3 个查询,获取排除的对象 - 1) secondary_dose

但是 3 个查询对我来说听起来太多了。 (我在详细视图中实现了这一点,但考虑到我只需要随时处理 1 个对象,这要容易得多。

感谢您的帮助!

django django-models django-views
1个回答
0
投票

您可以在

get_context_data
中进行二次过滤。 (我将其更改为使用
ListView
,因为这对于列表视图来说很有意义。)

from django.utils.timezone import now
from django.views.generic import ListView


class newlist(LoginRequiredMixin, ListView):
    template_name = "trackerapp/eatmodel_newlist.html"
    login_url = "eatlogin"
    context_object_name = "list"

    def get_queryset(self):
        return EatModel.objects.filter(user=self.request.user)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        t = now()
        context["need_second_dose"] = [em.second_dose and em.second_dose < t for em in context["list"]]
        context["need_third_dose"] = [em.third_dose and em.third_dose < t for em in context["list"]]
        context["need_fourth_dose"] = [em.fourth_dose and em.fourth_dose < t for em in context["list"]]
        return context
© www.soinside.com 2019 - 2024. All rights reserved.