我有以下架构
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 除了 Review
和 Comment
模型具有完全相同的 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/