python - 排除基于另一个没有外键的模型的值的模型

标签 python django python-3.x postgresql django-queryset

我有以下架构

class Review(models.Model):
    comment_id = models.CharField(max_length=32)

class Comment(models.Model):
    comment_id = models.CharField(max_length=32)
    uploaded = models.DateTimeField()

注意 1 除了 ReviewComment 模型具有完全相同的 comment_id 之外,没有外键>

注意 2 存在一对一/唯一关系(每个表中只会出现一次 comment_id)

我想做一个选择查询来获取所有 Review 模型,它们的相关 Comment 模型 IS NOT OLDER 超过 10 天。

最佳答案

选项 1:添加关系(强烈建议)

我强烈建议在这里使用 OneToOneField,因为这将确保引用完整性并检查唯一性。您可以使用以下方法构建此类模型:

class Review(models.Model):
    comment = models.<b>OneToOneField(</b>
        'Comment',
        to_attr=<b>'comment_id'</b>,
        on_delete=models.CASCADE
    <b>)</b>

class Comment(models.Model):
    comment_id = models.CharField(max_length=32, <b>unique=True</b>)
    uploaded = models.DateTimeField(<b>auto_now_add=True</b>)

这不仅保证了完整性,还使查询更加方便,我们可以简单地查询:

from django.utils import timezone
from datetime import timedelta

Review.objects.filter(
    <b>comment__uploaded__gt=(timezone.now()-timedelta(days=10)).date()</b>
).values('comment_id')

选项 2:使用嵌套查询进行查询

如果这完全不可能,你可以使用:

from django.utils import timezone
from datetime import timedelta

comments = Comment.objects.filter(
    uploaded__gt=(timezone.now()-timedelta(days=10)).date()
).values('comment_id')

然后我们可以通过以下方式获取相应的评论:

Review.objects.filter(
    comment_id__in=comments
)

以上将生成一个如下所示的查询:

SELECT review.*
FROM review
WHERE review.comment_id IN (
    SELECT U0.comment_id
    FROM comment U0
    WHERE U0.uploaded > 2019-09-06 00:00:00
)

关于python - 排除基于另一个没有外键的模型的值的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57956698/

相关文章:

html - 使用外键链接保存 modelForms 时 Django 'ManagementForm data is missing or has been tampered with'

python - 将代码从 Python 2.x 转换为 3.x

Python & Flask 错误使用 Flask-MySQL |未找到模块错误 : No module named 'flask_mysqldb'

python - 找到一个非常大的矩阵的特征值

python - 防止 MySQL-Python 在数据库名称参数周围插入引号

python - 如何让这个函数成为非阻塞的?

python - 如何找到最小的正整数以使数字单调?

python - 对于现有 UDF,雪花 UDF 返回 "Unknown user-defined function"

python - 如何将 MLP 的数据调整为 LSTM(预期 ndim=3,发现 ndim=2 错误)

python - 替换/更改 python 集中的项目