2017-03-05 8 views
0

私はdjangoを学んでいて、簡単なQuestion-Answerアプリケーションを作成しようとしています。ここでユーザーは質問や回答も好きです。今、私が何をしたいのか、特定の質問を言っていたトラックは、私は次のようにこれを追跡するための別のモデルを作成した/そう答えです: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"ではなく単に "answer"と呼んでください。 Djangoは自動的に "_id"パートをバックグラウンドで追加します。また、 "lik_by"ではなく "user"と関連する名前を "likes"と呼ぶべきで、 'user.likes.all()'などもできます。 'answer'と' question'と同じです。最後に、モデルは単数形を常に使用する必要があります。したがって 'class Vote(models.Model)'ではなく 'Votes 'でなければなりません。 – C14L

+0

ヒント@ C14Lをありがとう、私はそれを世話します。私はdjango rest frameworkシリアライザを使っているので、question_idを使用しました。これを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

ありがとうございました! –