2014-09-23 86 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()刪除重複項。

相關問題