ユーザーによってアップロードされたオブジェクトがあり、いくつかの詳細が含まれていますが、明確にするために、次のモデル表現で簡単に定義できます-
この後、他のユーザーは、このユーザーがアップロードしたものに賛成票と反対票を投じることができるため、投票モデルになります。
ここで、テンプレートに表示されるすべてのオブジェクトの賛成票と反対票を取得したいと考えています。ObjectDetailしたがって、upvote と downvoteという 2 つの関数をクラスに追加します。
このモデルの問題点は、20 個のオブジェクトがあるとします。各オブジェクトに対して 2 つのクエリが実行され、1 つは賛成票を獲得し、もう 1 つは反対票を獲得します。したがって、いいえ。クエリの数は、20 オブジェクトに対して 40 になりました。
これを微調整してクエリの数を減らし、各オブジェクトに賛成票と反対票を表示するにはどうすればよいでしょうか?
class ObjectDetail(models.Model):
    title = models.CharField()
    img = models.ImageField()
    description = models.TextField()
    uploaded_by = models.ForeignKey(User, related_name='voted_by')
    @property
    def upvote(self):
        upvote = Vote.objects.filter(shared_object__id = self.id, 
                             vote_type = True).count()
        return upvote
    @property
    def downvote(self):
        downvote = Vote.objects.filter(shared_object__id = self.id, 
                               vote_type = False).count()
        return downvote
class Vote(models.Model):
    vote_type = models.BooleanField(default = False)
    voted_by =  models.ForeignKey(User, related_name='voted_by')
    voted_for = models.ForeignKey(User, related_name='voted_for')
    shared_object = models.ForeignKey(ObjectDetail, null=True, blank=True)
    dtobject  = models.DateTimeField(auto_now_add=True)