2014-09-23 85 views
0

我有这些Models,我希望能够从前两个选择。如何从Django的两个不同表中选择?

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做同样的事情。

+1

您可能想查看[多对多关系](https://docs.djangoproject.com/en/1.7/topics/db/examples/many_to_many/)。 – Celeo 2014-09-23 17:29:02

+0

@Celeo:我不明白多对多的关系在这里可以满足,因为'Post'不能由许多'Users'制作,同样一个'Comment'属于许多帖子。你能发出更多的光线吗? – Yax 2014-09-23 18:26:23

+0

我应该链接[多对一](https://docs.djangoproject.com/en/1.7/ref/models/fields/#foreignkey)。 – Celeo 2014-09-23 18:39:29

回答

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) 

您可能想要限制查询集以避免不寻常的加载时间,因为查询集是eva luated int他sorted函数

+0

谢谢,但我怎么知道哪个帖子是哪个评论?我在查询中看不到关系。 – Yax 2014-09-23 18:17:45

+1

您可以使用'hasattr(obj,post_id)'来查看它是否是注释。这是一个例子,但您几乎可以使用任何独特的属性来检查类型。 – karthikr 2014-09-23 18:19:17

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) 

你最终会得到一个包含所有t的元组列表他发布你与这些帖子相关的评论。如果您按照元组的第三个元素对列表进行排序,那么您将按照您之前的datetime字段进行排序。您也可以通过制作set()删除重复项。

相关问题