首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理Django模型和关系数据的适当/最有效的方法

问处理Django模型和关系数据的适当/最有效的方法
EN

Stack Overflow用户
提问于 2012-08-02 06:04:15
回答 2查看 340关注 0票数 0

我很好奇在Django中处理模型的最好方法是什么。假设您想要制作一个处理电视节目列表的应用程序。处理该模型的一种方法是

代码语言:javascript
复制
class TVShow(models.Model)  
     channel = models.CharField()  
     show_name = models.CharField()  
     season = models.CharField()  
     episode = models.CharField()

它的优点是所有的东西都包装整齐。但是,如果我想要显示所有频道或所有show_names的列表,则必须遍历TVSHow对象并删除重复项

从另一方面来说,人们可以

代码语言:javascript
复制
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或所有通道变得容易,而不必担心不相关的数据。但是,除非您也向后映射,否则很难看到Channel a show是什么

有没有一种"pythonic“或Django首选的方法来做这件事?在空间、速度等方面有什么优势吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-02 06:23:32

你的第一次尝试看起来很好。也就是说,您可以使用

代码语言:javascript
复制
class TVShow(models.Model)  
     channel = models.CharField()  
     show_name = models.CharField()  
     season = models.CharField()  
     episode = models.CharField()

然后,您可以只使用django orm来执行您要查找的查询。

也就是说,如果你想要所有的频道都没有重复,你会说

代码语言:javascript
复制
TVShow.objects.distinct('channel')

distinct()的Django文档。

就性能而言,这是一种方法,因为您实际上是让数据库来做这件事。数据库就是为这些目的而设计的,并且应该比试图在代码中修剪它的速度快得多。

票数 2
EN

Stack Overflow用户

发布于 2012-08-02 06:47:00

使用规范化数据库结构的首选方法,除非它与性能相关,否则它将使您能够在代码中更容易地进行更复杂的查询。ForeignKey和ManyToManyField接受'related_name‘参数。

代码语言:javascript
复制
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')

以此类推。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11768264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档