我有这些Models
,我希望能够从前两个中进行选择。
class Comments(models.Model):
post_id = models.ForeignKey('Posts')
content = models.CharField(max_length=480)
time_created = models.DateTimeField()
class Posts(models.Model):
user_id = models.ForeignKey('Users')
content = models.CharField(max_length=480)
time_created = models.DateTimeField()
class Users(models.Model):
email = models.EmailField()
name = models.CharField(max_length=60)
time_created = models.DateTimeField()
我希望能够选择帖子及其评论,并按datetime
排序,以便Posts
和Comments
在展示时混合使用。
我认为Twitter对Tweets
和Retweets
做了同样的事情。
答案 0 :(得分:1)
您可能无法使用单个查询执行此操作。但是,您可以获取两个查询集并使用itertools合并两个迭代。
示例,假设您想要用户'帖子和评论,
posts = user.posts_set.all() #or Posts.objects.filter(user=user)
comments = Comments.objects.filter(post_id__user=user)
import itertools
qs = itertools.chain.from_iterable([posts, comments])
或者,如果您没有切片查询集,
qs = posts | comments
现在,您可以按键订购:
qs_sorted = sorted(qs, key=lambda x: x.time_created)
您可能希望限制查询集以避免异常加载时间,因为查询集是在sorted
函数
答案 1 :(得分:0)
选择某组帖子:
filtered_posts = Posts.objects.filter(however_you_filter_your_queryset)
获取与某个帖子相关的所有评论:
related_comments = p.comments_set.all()
您可以创建一个元组列表,其中每个元组都包含(data_type, content, time)
:
tuple_list = []
for p in filtered_posts:
post_tuple = ('post', p.content, p.time_created)
tuple_list.append(post_tuple)
related_comments = p.comments_set.all()
for c in related_comments:
comment_tuple = ('comment', p.content, p.time_created)
tuple_list.append(comment_tuple)
您最终会得到一个元组列表,其中包含您抓取的所有帖子以及与这些帖子相关的评论。如果您按照元组的第三个元素对列表进行排序,那么您将按照之后的datetime
字段进行排序。您还可以通过set()
删除重复项。