Django Rest Frameworkのtutorialにあるコードに投票機能を追加しようとしています。スニペットモデルの上に、私は投票モデルを追加しました:Django Rest FrameworkでシリアライザでFKを更新する方法
class Vote(models.Model):
created = models.DateTimeField(auto_now_add=True)
voter = models.ForeignKey(User, on_delete=models.CASCADE)
snippet = models.ForeignKey(Snippet, related_name='votes', on_delete=models.CASCADE)
class Meta:
ordering = ('created',)
は、スニペットに、ユーザー投票を投稿して検証した後、私は今、スニペットが受信した投票数を更新したい私は、スニペットモデルに追加( number_of_votesフィールド)。
私はそのような私のVoteSerializerのメソッドを作成して、それをやっている:
class VoteSerializer(serializers.HyperlinkedModelSerializer):
voter = serializers.ReadOnlyField(source='voter.username',validators=[UniqueValidator(queryset=VoteUp.objects.all(), message=already_voted)])
snippet = serializers.PrimaryKeyRelatedField(queryset=Snippet.objects.all())
def validate(self, data):
# ... my validation function
def create(self, validated_data):
obj = Vote.objects.create(**validated_data)
obj.snippet.number_of_votes += 1
obj.snippet.save()
return obj
それはうまく動作しますが、私はそれはそれを行うには良い方法かいないかどうか分かりません。より良い方法がありますか?
これはあなたの質問に対する回答ではありません。しかし、私はなぜあなたが投票数を維持しているのだろうと思っています。スニペットに関連付けられている各投票にスニペットIDを設定して、数を取得するだけでカウントできます。 –
'number_of_votes'変数の目的は何ですか?あなたがしたいのは、各スニペットの投票数を知っているだけであれば、外部キーから作られたクエリーセットから行うことができるはずです。 'snippet.vote_set.count()'は、 'snippet'との外部キーの関係を持つ投票数を返すべきです – MCBama
私は、多くのユーザーが注文したスニペットのページを表示したいと思うならば、降順投票数では、計算は1回だけ行われます。 – Patrick