2017-03-05 90 views
0

我正在學習Django,並試圖創建一個簡單的問題回答應用程序,其中用戶也可以喜歡的問題和/或答案。現在我要做的就是跟蹤誰喜歡的特定問題/答案,所以我創建了一個單獨的模型來跟蹤這個如下:Python的Django模型的基本知識

class Votes(models.Model): 
    answer_id = models.ForeignKey(Answers, related_name='likes_answers', null=True, default=None, db_column='answer_id') 
    question_id = models.ForeignKey(Questions, related_name='likes_questions', null=True, default=None, db_column='question_id') 
    likes_count = models.IntegerField(blank=True, default=0) 
    liked_by = models.ForeignKey(User, related_name='like_user', null=True, default=None, on_delete=models.CASCADE) 

現在,這種方法的問題是,每次一個問題或答案被喜歡這個模型將會有一個條目,它將創建多個與不同用戶相同的question_id或answer_id條目。雖然用戶不同,但很多answer_ids和question_ids正在重複......是正確的方法,還是我可以做得更好?

+0

不要稱他們爲「answer_id」,而只是「回答」。 Django將在幕後自動添加「_id」部分。另外,不要把它叫做「likes_by」,而是把「user」和相關的名字叫做「likes」,這樣你可以做'user.likes.all()'等等。對於'answer'和'question'也是一樣的。最後,模型應該總是使用單數,所以'class Vote(models.Model)'而不是「Votes」。 – C14L

+0

感謝提示@ C14L,我會照顧到這一點。我使用了question_id,因爲我正在使用django rest框架序列化程序,並且我想將它作爲JSON中的鍵發送給客戶端。即{{question_id}:}。當我使用問題時,它被髮送爲{「question」:},這是令人困惑的。序列化程序中的鍵與字段名有什麼不同? –

+0

是的,有,您應該爲DRF中的REST API字段進行「命名」,而不是在數據庫級別。 – C14L

回答

1

我想一個更好的方法將使用多對多的領域:用戶能夠喜歡多個問題/答案,並且問題/答案可能會被多個用戶喜歡。

假設你的答案有一個外鍵特定的問題,模型可能是這樣的:

class Question(models.Model): 
    # .. other attributes 
    liked_by = models.ManyToManyField(User, related_name = 'liked_question') 

class Answer(models.Model): 
    question = models.ForeignKey(Question) 
    # .. other attributes 
    liked_by = models.ManyToManyField(User, related_name = 'liked_answer') 

要獲得喜歡的答案所有用戶,您使用

answer_object.liked_by.all() 

對於(經常使用)喜歡數,您只需使用

answer_object.liked_by.count() 

多對多的領域工作其他領域爲了確定用戶喜歡,你可以使用(感謝相關的名稱)

user_object.liked_question_set.all() 

user_object.liked_answer_set.all() 
+0

非常感謝@L Green。這絕對是一個更好的方法! –

-1

這不是一個python,django的問題,它適合一個RDBMS設計問題。

但是,爲了回答你的問題,

如果你想從用戶投票檢查重複那麼它是正確的做法。

其他方法是將投票帖ID更新到用戶表。這當然是不好的方法。

+0

謝謝@sayingu !! –