如何在创建另一个模型时自动更新模型属性
How to auto update a models attribute on creation of another model
我一直在通过几个不同的课程学习 django 和 django rest,并开始了我自己的项目,这将是一个论坛类型的 web 应用程序。
I 4 模型 类 类别、子类别、线程和 Post。
我想要做的是为名为 num_threads 的子类别设置一个属性,只要为它相关的子类别创建线程,就可以更新该属性。同样,我希望线程具有属性 num_posts 和 num_views。我一直在使用外键来关联模型。现在我不确定我是否正确地完成了那部分。
这是我的 model.py:
from django.db import models
from django.contrib.auth.models import User
class Category(models.Model):
"""
Category Class:
Main Categories for GRDG Forum
Creation and Deletion will be restricted to site admin
"""
# Attributes
name = models.CharField(max_length=32, unique=True, blank=False)
description = models.TextField(max_length=150, blank=True)
def __str__(self):
return self.name
class SubCategory(models.Model):
"""
SubCategory Class:
SubCategories will be one to many relation with category ie: Multiple subcategories related to one category
Creation and Deletion will be restricted to site admin
GET methods restriction will vary by subcategory
"""
# References
category = models.ForeignKey(Category, on_delete=models.CASCADE)
# Attributes
name = models.CharField(max_length=32, unique=True, blank=False)
description = models.TextField(max_length=150)
num_threads = models.IntegerField(max_length=None, default=0)
def __str__(self):
return self.name
class Thread(models.Model):
"""
Class Thread
Threads will be one to many relation to subcategory ie: Multiple threads related to one subcategory
Creation and Deletion restricted to authorized and authenticated users
GET methods restriction will vary by parent subcategory.
"""
# References
subcategory = models.ForeignKey(SubCategory, on_delete=models.CASCADE)
user = models.ForeignKey(User, models.CASCADE)
# Attributes
title = models.CharField(max_length=32, unique=False, blank=False)
num_views = models.IntegerField(max_length=None, default=0)
num_posts = models.IntegerField(max_length=None, default=0)
locked = models.BooleanField(default=False)
author = models.CharField(max_length=32, blank=False)
def __str__(self):
return self.title
class Post(models.Model):
"""
Class Posts
Posts will be one to many relation to Thread ie: Multiple posts related to one Thread
Creation and Deletion restricted to authorized and authenticated users
"""
# References
thread = models.ForeignKey(Thread, on_delete=models.CASCADE)
user = models.ForeignKey(SubCategory, on_delete=models.CASCADE)
# Attributes
body = models.TextField(max_length=500, blank=False)
author = models.CharField(max_length=32, blank=False)
我在模型 类 中有分配外键的引用。
有没有一种方法可以在创建另一个具有外键的对象时自动更新模型属性。
IE: 增加一个子类num_thread,创建同外键线程时
在这里查看其他问题,我看到提到使用自定义保存方法,在查看其文档后我仍然不确定它是如何工作的。
请让我知道我可以使用的其他资源。
请不要在模型中存储 Thread
的数量(或任何其他聚合)。这是一种 数据重复 的形式,通常是 反模式 :这意味着当 Thread
是创建、更新(参考另一个 SubCategory
)或删除。事实证明,保持这些同步通常是一个难题,即使这两个表存储在同一个数据库中。
您可以删除 num_thread
字段并使用 .annotate(…)
[Django-doc] 并在必要时计算相关 Thread
的数量:
from django.db.models import <strong>Count</strong>
SubCategory.objects.annotate(
<strong>num_threads=Count('thread')</strong>
)
源自此查询集的 SubCategory
将具有一个额外属性 .num_threads
,其中包含 相关 Thread
个对象的数量.
我一直在通过几个不同的课程学习 django 和 django rest,并开始了我自己的项目,这将是一个论坛类型的 web 应用程序。
I 4 模型 类 类别、子类别、线程和 Post。 我想要做的是为名为 num_threads 的子类别设置一个属性,只要为它相关的子类别创建线程,就可以更新该属性。同样,我希望线程具有属性 num_posts 和 num_views。我一直在使用外键来关联模型。现在我不确定我是否正确地完成了那部分。 这是我的 model.py:
from django.db import models
from django.contrib.auth.models import User
class Category(models.Model):
"""
Category Class:
Main Categories for GRDG Forum
Creation and Deletion will be restricted to site admin
"""
# Attributes
name = models.CharField(max_length=32, unique=True, blank=False)
description = models.TextField(max_length=150, blank=True)
def __str__(self):
return self.name
class SubCategory(models.Model):
"""
SubCategory Class:
SubCategories will be one to many relation with category ie: Multiple subcategories related to one category
Creation and Deletion will be restricted to site admin
GET methods restriction will vary by subcategory
"""
# References
category = models.ForeignKey(Category, on_delete=models.CASCADE)
# Attributes
name = models.CharField(max_length=32, unique=True, blank=False)
description = models.TextField(max_length=150)
num_threads = models.IntegerField(max_length=None, default=0)
def __str__(self):
return self.name
class Thread(models.Model):
"""
Class Thread
Threads will be one to many relation to subcategory ie: Multiple threads related to one subcategory
Creation and Deletion restricted to authorized and authenticated users
GET methods restriction will vary by parent subcategory.
"""
# References
subcategory = models.ForeignKey(SubCategory, on_delete=models.CASCADE)
user = models.ForeignKey(User, models.CASCADE)
# Attributes
title = models.CharField(max_length=32, unique=False, blank=False)
num_views = models.IntegerField(max_length=None, default=0)
num_posts = models.IntegerField(max_length=None, default=0)
locked = models.BooleanField(default=False)
author = models.CharField(max_length=32, blank=False)
def __str__(self):
return self.title
class Post(models.Model):
"""
Class Posts
Posts will be one to many relation to Thread ie: Multiple posts related to one Thread
Creation and Deletion restricted to authorized and authenticated users
"""
# References
thread = models.ForeignKey(Thread, on_delete=models.CASCADE)
user = models.ForeignKey(SubCategory, on_delete=models.CASCADE)
# Attributes
body = models.TextField(max_length=500, blank=False)
author = models.CharField(max_length=32, blank=False)
我在模型 类 中有分配外键的引用。 有没有一种方法可以在创建另一个具有外键的对象时自动更新模型属性。 IE: 增加一个子类num_thread,创建同外键线程时
在这里查看其他问题,我看到提到使用自定义保存方法,在查看其文档后我仍然不确定它是如何工作的。
请让我知道我可以使用的其他资源。
请不要在模型中存储 Thread
的数量(或任何其他聚合)。这是一种 数据重复 的形式,通常是 反模式 :这意味着当 Thread
是创建、更新(参考另一个 SubCategory
)或删除。事实证明,保持这些同步通常是一个难题,即使这两个表存储在同一个数据库中。
您可以删除 num_thread
字段并使用 .annotate(…)
[Django-doc] 并在必要时计算相关 Thread
的数量:
from django.db.models import <strong>Count</strong>
SubCategory.objects.annotate(
<strong>num_threads=Count('thread')</strong>
)
源自此查询集的 SubCategory
将具有一个额外属性 .num_threads
,其中包含 相关 Thread
个对象的数量.