2017-01-19 7 views
2

私はコメントシステムを構築して投票を実装しようとしています。だから私は新しいコメントオブジェクトを作成するcomment = Comment.objects.create(comment_text=ajax_comment, author=str(request.user), destination=id)行で、私はupvotesフィールドを追加したいと思います。したがって、オブジェクトが作成されるときにupvotes=0。これはどうすればいいですか?あなたが何をしたいか新しいインスタンスが作成されたときにForeignKeyフィールドを割り当てる方法

models.py

class Comment(models.Model): 
    user = models.ForeignKey(User, default=1) 
    destination = models.CharField(default='1', max_length=12, blank=True) 
    author = models.CharField(max_length=120, blank=True) 
    comment_id = models.IntegerField(default=1) 
    parent_id = models.IntegerField(default=0) 
    comment_text = models.TextField(max_length=350, blank=True) 
    timestamp = models.DateTimeField(default=timezone.now, blank=True) 

    def __str__(self): 
     return self.comment_text 


class CommentScore(models.Model): 
    user = models.ForeignKey(User, default=1) 
    comment = models.ForeignKey(Comment, related_name='score') 
    upvotes = models.IntegerField(default=0) 
    downvotes = models.IntegerField(default=0) 

    def __str__(self): 
     return str(self.comment) 

views.py

comment_list = Comment.objects.filter(destination=id) 
score = CommentScore.objects.all() 

if request.is_ajax(): 
    if comment.is_valid(): 
     comment = Comment.objects.create(comment_text=ajax_comment, author=str(request.user), destination=id) 
     print(comment) 
     comment.save() 
     username = str(request.user) 
     return JsonResponse({'text': ajax_comment, 'text_length': comment_length, 'username': username}) 
    else: 
     print(comment.errors) 

context = { 
    'score': score, 
    'comment_list': comment_list, 
} 

return render(request, 'article.html', context) 
+0

'upvotes'フィールドは既に' CommentScore'モデルにあります。 "upvotesフィールドを追加する"とはどういう意味ですか? –

+0

私は投票のための別々のモデルを作るように言われました。人々が何度もコメントに投票し、何回投票したのかを警察に警告するからです。だから私はそれをして、今私は2つのモデルをマージしようとしています。だから、 'Comment'が作成されたら' CommentScore'の 'ForeignKey'を追加して、' upvotes = 0'フィールドを追加し、誰が 'CommentScore'の' user'フィールドで投稿をupvotedしたのかを知りたいと思います。何か案が? – Zorgan

+0

"up votes"と "down vote"は、コメントオブジェクトが既に作成された後に発生します。したがって、コメントが作成され、別のユーザーがオブジェクトに到達して投票または投票を選択すると、フロントエンドはバックエンドを呼び出してCommentオブジェクトのキーを使用してCommentScoreオブジェクトを作成する必要があります。 –

答えて

2

は、本質的に新しいCommentScoreオブジェクトを作成し、あなたのCommentにマッピングされます。このようにすることができます。コメントオブジェクトがすでに作成された後に「アップ票」と「ダウン票」は起こる

comment_list = Comment.objects.filter(destination=id) 
score = CommentScore.objects.all() 

if request.is_ajax(): 
    if comment.is_valid(): 
     comment = Comment.objects.create(comment_text=ajax_comment, author=str(request.user), destination=id) 
     print(comment) 
     comment.save() 
     # This line creates a CommentScore model which maps to your Comment model 
     com_score = CommentScore.objects.create(comment=comment) 
     com_score.save() 
     username = str(request.user) 
     return JsonResponse({'text': ajax_comment, 'text_length': comment_length, 'username': username}) 
    else: 
     print(comment.errors) 

context = { 
    'score': score, 
    'comment_list': comment_list, 
} 

return render(request, 'article.html', context) 
+0

これはうまく見えますので、私はこれを今まで通り抜けて動作させようとしています。だから私が 'com_score = CommentScore.objects.create(comment = comment、upvotes = 0)'をしたら。どのように私は、テンプレート内の各コメントのアップフォースの数を表示するのですか? (私の編集で現在のテンプレートをペーストしました) – Zorgan

2

。したがって、コメントが作成され、別のユーザーがオブジェクトに到達して投票または投票を選択すると、フロントエンドはバックエンドを呼び出してCommentオブジェクトのキーを使用してCommentScoreオブジェクトを作成する必要があります。基本的に何が起こるだろうことはこれです:

Comment (object) <- CommentScore (object) 
       ^- CommentScore (object) 

あなたはコメントオブジェクトにリンクされている多くのCommentScoreオブジェクトを持っています。各CommentScoreオブジェクトは、upv​​oted(upvote = 1、downvote = 0)またはdownvoted(upvote = 0、downvote = 1)のユーザを記録します。 この設定では、CommentオブジェクトにリンクされているすべてのCommentScoreオブジェクトのupvotesまたはdownvotesの合計をクエリして取得するのが簡単になります。ここで

は、Djangoのドキュメント(https://docs.djangoproject.com/en/1.10/topics/db/examples/many_to_one/)からの例です:あなたのケースのレポーターで

はコメントであるとの記事がCommentScoreです。

作成し、いくつかの記者:

r = Reporter(first_name='John', last_name='Smith', email='[email protected]')

r.save()

r2 = Reporter(first_name='Paul', last_name='Jones', email='[email protected]')

r2.save()

Articlを作成します。 E:

日時輸入日から

a = Article(id=None, headline="This is a test", pub_date=date(2005, 7, 27), reporter=r)

a.save()

a.reporter.id

1

a.reporter

<Reporter: John Smith>

この例では、記者が書いたすべての記事を取得することができます

Article.objects.filter(reporter__first_name='John')

<QuerySet [<Article: John's second story>, <Article: This is a test>]>

はここのためのより具体的な例ですあなたのケース:

>>> from testapp.models import Comment, CommentScore 

# Creates one Comment object with pk=1 
>>> Comment.objects.create() 
<Comment: > 

# Create 3 ComentScore objects that are associated with the first Comment I create 
CommentScore.objects.create(comment=Comment.objects.get(pk=1)) 
<CommentScore: > 

>>> CommentScore.objects.create(comment=Comment.objects.get(pk=1)) 
<CommentScore: > 

>>> CommentScore.objects.create(comment=Comment.objects.get(pk=1)) 
<CommentScore: > 

# Now get the original Comment object that I created in my first step 
>>> cob = Comment.objects.get(pk=1) 
>>> cob.score 
<django.db.models.fields.related_descriptors.create_reverse_many_to_one_manager.<locals>.RelatedManager object at 0x107d67320> 

# Grab all the CommentScore objects associated to that comment 
cob.score.all() 
<QuerySet [<CommentScore: >, <CommentScore: >, <CommentScore: >]> 

# Print upvote for each CommentScore object that's associated to that Comment I created 
>>> for ob in cob.score.all(): 
...  print(ob.upvotes) 
... 
0 
0 
0 
+0

私の意見では、OPの質問は、あなたが実演した_retrieval_とは対照的に、CommentScoreの_creation_を扱っています。 – Anomitra

+0

作成例を上記の例として示します。記事 - > CommentScore –

+0

申し訳ありませんが、気がついただけです。乾杯! :) – Anomitra

関連する問題