如何缩短此代码以创建 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')
...
这是建议的方法。
想象一下 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')
...
这是建议的方法。