2017-03-18 510 views
0

我有一個Django模型類似Django模型查詢

messageto:
messagefrom:
消息:

的事情是,當我有兩個特定用戶之間顯示的消息,我不得不通過存儲在數據庫中的所有消息並檢查messageto和messagefrom字段。

我和django一起工作的方式就像每個模型都代表一個表,並且對應於模型類的每個對象,我們在數據庫中都有一行。

所以根據這個邏輯,每個messageto和messagefrom combo都有一個單獨的表是不可能的,我認爲我們需要爲他們每個人聲明一個單獨的類。

有沒有一種方法可以在不通過每條消息的情況下在用戶之間找到消息?

我正在尋找具有相同實現方式或新實現的任何方式。

請幫忙。

回答

0

數據庫不會遍歷所有內容。它保持記錄索引。

你可以爲用戶建立一個模型(如果不是django提供了一個默認的用戶模型)。

class Users(models.Model): 
    # all the fields you want for a user(username, password, email,etc..) 
    message_exchanged=models.ManyToManyField(Messages,through='MessageMap',through_fields=('messagefrom','message')) 

然後你可以有一個類來存儲消息。

class Messages(models.Model): 
    message_text=models.TextField() 
    #other fields you want to add for a message 

在這裏你有你的MessageMap模型

class MessageMap(models.Model): 
messagefrom=models.ForeignKey(Users) 
message=models.ForeignKey(Message) 
messageto=models.ForeignKey(User,related_name='next_messsage',null=True,blank=True) 

,一旦你保存的消息。你可以使用查詢消息

messages=Message.objects.filter(Q(messagefrom = from_user),Q(messageto=to_user)) 
messages=Message.objects.filter(Q(messagefrom = from_user),Q(messageto=to_user)) 
0

一種方法是使用Q對象來解決這個問題。如果您的模型名爲Message,則可以使用以下查詢使兩個用戶A和B之間交換所有消息:

Message.objects.filter(Q(messageto = A,messagefrom = B)| Q(messageto = B,messagefrom = A))

有關Q對象的更多詳細信息,請參見https://docs.djangoproject.com/en/1.10/topics/db/queries/#complex-lookups-with-q-objects

+0

但即使當數據庫返回它們後,它通過一切迭代後返回正確嗎? 因此,無論我在視圖還是數據庫中迭代,它應該會更好,但仍然不夠好嗎? –