首页 > 解决方案 > Django 过滤器:SQLite 和 PostgreSQL 过滤结果不同

问题描述

我在数据库表上运行了一个相对简单的查询;过滤器检查 2 个日期字段的值并返回一个查询集。检查的字段是authored_report_receivedsubbed_complete。如果 authored_report_received 设置了日期并且 subbed_complete 没有设置日期,则将返回结果。如果这两个字段都设置了日期,则不返回任何结果。(然后对返回的任何结果和当前日期之间的“未完成天数”进行简单计算。)这在 SQLite 数据库上本地运行绝对正常,但是当我上传到 heroku 以与 PostgreSQL 数据库一起使用时,过滤器确实似乎不起作用,因为它似乎忽略了subbed_complete中的任何日期值场地。我不明白为什么不。SQLite 和 PostgreSQL 处理过滤器的方式有区别吗?我找不到任何表明这一点的文档。

# views.py
class EpgReportSubeditListView(LoginRequiredMixin, EpgUserPassesTestMixin, ListView):
    """EPG-only: create a list view of reports currently being subedited
    """
    model = Report
    template_name = 'tracker/epg_report_subedit.html'
    context_object_name = 'report_subedit'
    ordering = ['subeditor']

    def get_queryset(self):
        today = datetime.now().date()
        out = []
        for obj in (self.model.objects.filter(subbed_complete__isnull=True) and self.model.objects.filter(authored_report_received__isnull=False)):
            setattr(obj, 'days_diff', (today - obj.authored_report_received).days)
            out.append(obj)
        return out

# models.py
class Report(models.Model):
    """Define fields for Report object (representing a case report)
    """
    case = models.ForeignKey(Case, on_delete=models.CASCADE, related_name='reports')
    editor = models.ForeignKey(User, on_delete=False,
                               limit_choices_to={'groups__name': 'editors'},
                               related_name='editor', null=True)
    
    # editing workflow info
    authored_report_received = models.DateField(null=True, blank=True)
    subbed_complete = models.DateField(null=True, blank=True)
    subeditor = models.ForeignKey(User, on_delete=False,
                                  limit_choices_to={'groups__name': 'subeditors'},
                                  related_name='subeditor', null=True, blank=True)
    sent_to_editor = models.DateField(null=True, blank=True)
    edited = models.DateField(null=True, blank=True)
    reporter_queries = models.CharField(max_length=3,
                                        choices=Binary_Choices,
                                        default="n")
    sent_to_deskeditor = models.DateField(null=True, blank=True)
    taken_by_deskeditor = models.DateField(null=True, blank=True)
    deskeditor = models.ForeignKey(User, on_delete=False,
                                   limit_choices_to={'groups__name': 'deskeditors'},
                                   related_name='deskeditor', null=True, blank=True)
    deskedit_complete = models.DateField(null=True, blank=True)
    sent_to_counsel = models.DateField(null=True, blank=True)
    received_from_counsel = models.DateField(null=True, blank=True)
    date_editor_publish_approve = models.DateField(null=True, blank=True)

    def get_absolute_url(self):
        return reverse("epg_home")

    def __str__(self):
        return f'{self.case} | f: {self.filename}'

标签: djangopostgresqlsqlitedjango-queryset

解决方案


Sqlite 和 PostgreSQL 处理日期的方式不同。subbed_complete是一个models.DateField字段,但是sqlite3

没有为存储日期和/或时间预留存储类。相反,SQLite 的内置日期和时间函数能够将日期和时间存储为 TEXT、REAL 或 INTEGER 值:

应用程序可以选择以任何这些格式存储日期和时间,并使用内置的日期和时间函数在格式之间自由转换。

因此,您应该使用 postgresql 在另一个环境中测试您的代码并调整查询。

https://www.sqlite.org/datatype3.html


推荐阅读