我对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分钟。谢谢。
答案 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