首页 > 解决方案 > django 在创建另一个模型时枚举模型的整数字段

问题描述

from django.db import models

class Game(models.Model):
    description = models.TextField(max_length=8192)

class GamePreview(models.Model):
    game = models.OneToOneField(Game, on_delete=models.CASCADE)
    comments = models.IntegerField(default=0) # Want to + 1 this when a comment gets created

class GameComment(models.Model):
    game = models.ForeignKey(Game, on_delete=models.CASCADE)
    comment = models.CharField(max_length=512)

    @classmethod # does not work
    def create(cls, game):
        comment = cls(game=game)
        preview = GamePreview.objects.get(game=comment.game)
        preview.comments += 1
        return preview

基本上,我有一个 GamePreview 模型,它有一个 IntgerField 应该显示评论的数量,但我不知道如何在创建 GameComment 时执行 preview.comments += 1 ......

标签: pythondjango

解决方案


不要,您可以对GamePreview对象进行注释以确定评论的数量。

因此,您可以删除该comments字段:

class GamePreview(models.Model):
    game = models.OneToOneField(Game, on_delete=models.CASCADE)
    # no comments

然后如果您需要相关的数量GameComment,您可以使用.annotate(…)[Django-doc]

from django.db.models import Count

GamePreview.objects.annotate(
    comments=Count('game__gamecomment')
)

GamePreview从此查询集中产生的对象将具有一个额外的属性.comments,其中包含相关 GameComments 的数量。


如果你真的想增加评论的数量,你可以使用:

class GameComment(models.Model):
    game = models.ForeignKey(Game, on_delete=models.CASCADE)
    comment = models.CharField(max_length=512)

    @classmethod # does not work
    def create(cls, game, comment):
        comment = cls(game=game, comment=comment)
        preview = GamePreview.objects.get(game_id=comment.game_id)
        preview.comments = F('comments') + 1
        preview.save()
        return comment

但这通常不是一个好主意:如果评论被删除,或者不再属于该游戏而是属于另一个,您将需要编写一些逻辑来更改它。通常很难涵盖所有可能的情况。


推荐阅读