问题编写/了解Django自定义管理器

时间:2019-10-11 21:20:31

标签: python django django-models

我对Django的自定义管理器有疑问。这可能很简单,但我对管理人员不太了解。这是我的代码:

class Season(models.Model):
    id       = models.AutoField(auto_created=True, primary_key=True)
    sku      = models.CharField(max_length=16, default=secrets.token_urlsafe(8), editable=False)
    title    = models.CharField(max_length=64, unique=True)
    slug     = models.SlugField(max_length=64, unique=True)
    tutorial = models.ForeignKey(Tutorial, on_delete=models.DO_NOTHING)
    created  = models.DateTimeField(auto_now_add=True)

    objects    = models.Manager() # Default Manager
    custom_obj = SeasonManager()  # Custom Manager in (managers.py)

    def __str__(self):
        return self.title

class Lesson(models.Model):
    id      = models.AutoField(auto_created=True, primary_key=True)
    sku     = models.CharField(max_length=16, default=secrets.token_urlsafe(8), editable=False)
    title   = models.CharField(max_length=64, unique=True)
    slug    = models.SlugField(max_length=64, unique=True)
    content = models.TextField()
    season  = models.ForeignKey(Season, on_delete=models.SET_NULL, null=True, blank=True)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title


class Video(models.Model):
    id       = models.AutoField(auto_created=True, primary_key=True)
    sku      = models.CharField(max_length=16, default=secrets.token_urlsafe(8), editable=False)
    title    = models.CharField(max_length=64, unique=True)
    slug     = models.SlugField(max_length=64, unique=True)
    content  = models.TextField()
    view     = models.PositiveIntegerField(default=0)
    lesson   = models.ForeignKey(Lesson, on_delete=models.SET_NULL, null=True, blank=True)
    created  = models.DateTimeField(auto_now_add=True)
    video_file   = models.FileField(upload_to='tutorialApp/videos')
    video_length = models.CharField(max_length=32)

    def __str__(self):
        return self.title

结构如下:每个季节都有一些课程,每个课程都有一些视频,每个视频都有长度。

我想写一个经理,显示一个季节中视频长度的总和。 (可以显示一个季节中有多少分钟的视频的经理)

而且我也不知道哪种字段类型最适合变量video_length?现在,我的video_length是CharField,所以当我写1:14时,它意味着1小时14分钟。谢谢。

1 个答案:

答案 0 :(得分:0)

首先,我强烈建议您将video_length存储为分钟数的IntegerField,以便您可以更轻松地在算术或比较中使用它。

第二,我认为您正在寻找的是聚合/注释[0]而不是管理器,并且与模型方法[1]结合使用。

因此,您可能要做的一个示例是:

class Season(models.Model):
    id       = models.AutoField(auto_created=True, primary_key=True)
    sku      = models.CharField(max_length=16, default=secrets.token_urlsafe(8), editable=False)
    title    = models.CharField(max_length=64, unique=True)
    slug     = models.SlugField(max_length=64, unique=True)
    tutorial = models.ForeignKey(Tutorial, on_delete=models.DO_NOTHING)
    created  = models.DateTimeField(auto_now_add=True)

    objects    = models.Manager()

    def __str__(self):
        return self.title

    def total_video_length(self):
        season_videos = Video.objects.filter(lesson__season=self)
        aggregated = season_videos.aggregate(total_length=models.Sum('video_length'))
        return aggregated['sum']

# So that elsewhere you can do something like:
season = Season.objects.first()
total_video_length = season.total_video_length()

[0] https://docs.djangoproject.com/en/2.2/topics/db/aggregation/

[1] https://docs.djangoproject.com/en/2.2/topics/db/models/#model-methods