如何从Django中的两个不同表中选择?

时间:2014-09-23 17:27:39

标签: python django django-models django-views

我有这些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排序,以便PostsComments在展示时混合使用。 我认为Twitter对TweetsRetweets做了同样的事情。

2 个答案:

答案 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()删除重复项。