如何缩短此代码以创建 Django 模型,使其在功能方面相同

How to short down this code to create django model so it works the same in term of functionality

想象一下 Netflix 网站,我想存储 link 多季多集电视节目的视频,我想增加某个电视节目的季数和集数根据管理区域的具体需要。我不知道该怎么做,而不仅仅是为每一集 link 和季节模型创建变量。请帮忙 !感谢 adv

class Tv_Shows(models.Model):
    STATUS_CHOICES = (
        ('draft', 'Draft'),
        ('published', 'Published'),
)
    title = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250,
        unique_for_date='publish')
    author = models.ForeignKey(User,
        on_delete=models.CASCADE,
        related_name='blog_posts')
    body = models.TextField()
    episode1 = models.CharField(max_length=100, null=True)
    episode2 = models.CharField(max_length=100, null=True)
    episode3 = models.CharField(max_length=100, null=True)
    episode4 = models.CharField(max_length=100, null=True)
    episode5 = models.CharField(max_length=100, null=True)
    episode6 = models.CharField(max_length=100, null=True)
    episode7 = models.CharField(max_length=100, null=True)
    episode8 = models.CharField(max_length=100, null=True)
    episode9 = models.CharField(max_length=100, null=True)
    episode10 = models.CharField(max_length=100, null=True)
    
    imdb_rating = models.DecimalField(null=True, max_digits=12, decimal_places=1)
    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    views = models.IntegerField(default=0)
    status = models.CharField(max_length=10,
        choices=STATUS_CHOICES,
        default='draft')

    class Meta:
        ordering = ('-publish',)
    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('blog:post_detail',

                        args=[self.publish.year,
                        self.publish.month,
                        self.publish.day, self.slug])

    

    objects = models.Manager() # The default manager.   
    published = PublishedManager() # Our custom manager.
    tags = TaggableManager()

创建一个新的table episode,在两个table之间创建一个一对多的关系。

您需要创建一个 Episode 模型,该模型带有代表节目的外键。 这将是正常的数据库设计,您不需要每次都更改模型。

这就是它的样子。

class TvShow(models.Model):
    STATUS_CHOICES = (
        ('draft', 'Draft'),
        ('published', 'Published'),
)
    title = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250, unique_for_date='publish')
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_posts')
    body = models.TextField()
    
    imdb_rating = models.DecimalField(null=True, max_digits=12, decimal_places=1)
    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    views = models.IntegerField(default=0)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')

    class Meta:
        ordering = ('-publish',)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('blog:post_detail', args=[self.publish.year, self.publish.month, self.publish.day, self.slug])    

    objects = models.Manager() # The default manager.   
    published = PublishedManager() # Our custom manager.
    tags = TaggableManager()
class Episode(models.Model):
    title = models.CharField(max_length=250)
    show = models.ForeignKey(TvShow, on_delete=models.CASCADE, related_name='episodes')
    
    ...
    objects = models.Manager()

如果一集可以有多个电视节目作为其父级,那么您可以选择 many to many field

现在,要访问节目的所有剧集,您可以执行以下操作

tv_show = TvShow.objects.get(**kwargs)
tv_show.episode_set
# returns a django queryset object

相关文档在这里: django documentation

这样想:

剧集有主要内容。季节和电视节目的详细信息只是元数据。所以从主要内容开始(很小child)。

Episodes > Seasons > Tv Show

那么数据库设计是怎样的:

Class TvShow(models.Model):
    name = models.CharField(max_length=30)
    ...

    def get_all_seasons(self):
        return self.tv_show_seasons.all().order_by('-created') # all seasons for particular tv show

Class Season(models.Model):
    tv_show = models.ForeignKey('TvShow', on_delete=models.CASCADE, related_name='tv_show_seasons')
    number = models.CharField(max_length=30)
    ...

    def get_all_episodes(self):
        return self.season_episodes.all().order_by('-created') # all episodes for a particular season

Class Episode(models.Model):
    season = models.ForeignKey('Season', on_delete=models.CASCADE, related_name='season_episodes')
    ...

这是建议的方法。