Django: Boundaries

22nd April 2021 at 11:14am
Django

Django 中有非常多的类,比如 Model、View、Form 等。它们各自有各自的职责边界。

Model Manager and Model

观察下面的例子:

class ActiveManager(models.Manager):
    def active(self):
        return self.filter(active=True)

class Product(models.Model):
    name = models.CharField(max_length=32)
    description = models.TextField(blank=True)
    price = models.DecimalField(max_digits=6, decimal_places=2)
    slug = models.SlugField(max_length=48)
    active = models.BooleanField(default=True)
    in_stock = models.BooleanField(default=True)
    date_updated = models.DateTimeField(auto_now=True)

    tags = models.ManyToManyField(ProductTag, blank=True)

    objects = ActiveManager()
        
    def tag_count(self):
        return self.tags.count()

    def __str__(self):
        return f"{self.name} ({self.pk})"

重点在 ActiveManager.active() 以及 Product.tag_count()。可以看出前者是针对于 model 列表的操作,后者则是针对单个 model 的操作。

Form

Form 类应该只关心数据的 HTML 展现、检验、清洗。它里面不应该有业务逻辑。业务逻辑应该在 View 中实现。同时由于 Form 类拿不到 request object,因此它想做业务逻辑也很难。

django.contrib.auth.forms.AuthenticationForm 是一个例子,用户提交用户名密码后,AuthenticationFormclean() 函数会对用户名密码做验证。

View

业务逻辑应该在 View 层实现。