我很想知道在Django中处理模型的最佳方法是什么。假设你想创建一个处理电视节目列表的应用。处理模型的一种方法是
class TVShow(models.Model)
channel = models.CharField()
show_name = models.CharField()
season = models.CharField()
episode = models.CharField()
其优点是所有东西都包装整齐。但是,如果我想显示所有频道或所有show_names的列表,我将不得不浏览TVSHow对象并删除重复项
另一方面可以
class CommonModel(models.Model)
name = models.CharField()
class Meta:
Abstract = True
class Channel(CommonModel)
show_name = models.ManyToMany(ShowName)
class ShowName(CommonModel)
seasons = models.ManyToMany(Seasons)
class Season(CommonModel)
episodes = models.ManyToMany(Episodes)
class Episode(CommonModel)
这样可以轻松显示所有ShowNames或所有频道,而无需担心不相关的数据。但是,除非你回映一下,否则很难看出频道是什么频道
是否有“pythonic”或Django首选方法?在空间,速度等方面是否有任何优势?
谢谢!
答案 0 :(得分:2)
你最初的刺伤看起来很好。也就是说,你可以使用
class TVShow(models.Model)
channel = models.CharField()
show_name = models.CharField()
season = models.CharField()
episode = models.CharField()
然后你可以使用django orm来完成你正在寻找的查询。
也就是说,如果你想要所有没有重复的频道,你会说
TVShow.objects.distinct('channel')
distinct()的Django文档。
就性能而言,这是实现它的方法,因为您实际上是在让数据库执行此操作。数据库是为这些目的而设计的,并且应该比尝试在代码中修剪它快得多。
答案 1 :(得分:1)
使用规范化数据库结构的首选方法,除非它与性能相关,它将使您能够更轻松地在代码中进行更复杂的查询。 ForeignKey和ManyToManyField接受'related_name'参数。
class Channel(models.Model):
pass
class Show(models.Model):
# this means you can have same show on different channels
channels = models.ManyToManyField(Channel, related_name='shows')
class Episode(models.Model):
# this means that one episode can be related only to one show
show = models.ForeignKey(Show, related_name='episodes')
Channel.objects.filter(shows__name='Arrested Development')
Channel.objects.get(name='Discovery').shows.all()
Show.objects.get(name='Arrested Development').episodes.all()
#2 db queries, 1 join
Episode.objects.get(name='Arrested Development S01E01',
select_related='show').show.channels.all()
#1 db query, 3 joins
Channel.objects.filter(shows__episode__name='Arrested Development S01E01')
依旧......