python - 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 ......
解决方案
请不要,您可以对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
,其中包含相关 GameComment
s 的数量。
如果你真的想增加评论的数量,你可以使用:
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
但这通常不是一个好主意:如果评论被删除,或者不再属于该游戏而是属于另一个,您将需要编写一些逻辑来更改它。通常很难涵盖所有可能的情况。
推荐阅读
- sql - 计算器与 SQL Server 给出不同的结果
- php - Illuminate\Database\QueryException : SQLSTATE[HY000] [1045] 用户 'root'@'localhost' 的访问被拒绝(使用密码:YES)
- javascript - 富文本编辑器是如何工作的?反应原生
- node.js - 如何在 Docker 上安装 nodejs?(Windows 容器)
- javascript - 将 html 元素从锚标记传递到 django 视图
- mongodb - MongoDB bindIP 地址有优先顺序吗?
- css - 在 CSS 中堆叠非同级元素
- javascript - 从 WebGL Unity 应用程序中触发 iframe/modal 覆盖?
- javascript - Puppeteer 从输入中获取数据
- visual-c++ - 在 MSVC 中启用 Wsign-compare