如何在创建另一个模型时自动更新模型属性

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 个对象的数量.