【问题标题】:Djnago Models Design DatabaseDjango 模型设计数据库
【发布时间】:2021-07-21 10:44:01
【问题描述】:

我是 Django 项目的新手,想知道设计模型的最佳实践是什么。 我正在创建一个小项目,该项目将以类别和子类别的方式收集故事。我将其标记为 Django,因为我还想验证应用程序的范围。

应用程序: 索引,流派

设计:

Index

Genre
|-- Story
    |--Section
         |-- Chapters
             |--Paragraph
                 |-- title
                 |-- text
                 |-- highlights 

genre.models.py

class Story(models.Model):
    stry = models.CharField(max_length=256,unique=True)
    id =models.AutoField(primary_key=True)
    def __str__(self):
        return self.stry
class Section(models.Model):
    stry = models.ForeignKey(Story,on_delete=models.CASCADE)
    name = models.CharField(max_length=256)
    desc=models.TextField()
    id =models.AutoField(primary_key=True)
    slug = models.CharField(max_length=240, null=True, blank=False)
    created_at = models.DateTimeField(auto_now_add=True, null=False)
    updated_at = models.DateTimeField(auto_now=True, null=False)    

class Chapter(models.Model):    
    sec = models.ForeignKey(Section,on_delete=models.CASCADE)
    name = models.CharField(max_length=256)
    desc=models.TextField()
    id =models.AutoField(primary_key=True)
    slug = models.CharField(max_length=240, null=True, blank=False)
    created_at = models.DateTimeField(auto_now_add=True, null=False)
    updated_at = models.DateTimeField(auto_now=True, null=False)
class Paragraph(models.Model):
    chap = models.ForeignKey(Chapter,on_delete=models.CASCADE)
    title = models.CharField(max_length=120, null=True, blank=False)
    subtitle = models.CharField(max_length=180, null=True, blank=False)
    slug = models.CharField(max_length=240, null=True, blank=False)
    body = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True, null=False)
    updated_at = models.DateTimeField(auto_now=True, null=False)
    

体裁可以有很多故事,每个部分可以有很多章节和类似的模式

问题:

  • 是否有更好的设计模型可供我研究?

  • 可以将它们划分为不同的应用程序,或者为每种类型提供一个应用程序,或者 包括流派作为模型。

【问题讨论】:

  • 你的index-app 会做什么?
  • @KlimBim 索引应用程序将用作索引。将所有类型显示为列表并允许搜索选项以查找特定故事。我打算为每种类型制作一个应用程序,并使用 idex 显示所有应用程序列表。我认为这是一个非常糟糕的主意
  • 你可以分开。但是,当您想在不同的应用程序中使用您的 templates 或其他东西时,您必须注意您的 namespace。例如,如果在urls.py 中设置了app_name。如果你是 django 的新手,你可以很容易地做到这一点。为每个目的创建不同的path。例如,path(genre/thriller/.......)、path(genre/comedy.....) 等并将其保存在一个应用程序中。

标签: python django django-models database-design model


【解决方案1】:

我会提出这种设计。

class DateTimeSlug(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    slug = models.CharField(max_length=240)
    
    class Meta:
        abstract = True

    
class NameDesc(models.Model):
    name = models.CharField(max_length=256)
    desc=models.TextField()

    class Meta:
        abstract = True

class Story(models.Model):
    stry = models.CharField(max_length=256, primary_key=True)

    def __str__(self):
        return self.stry
    
class Section(DateTimeSlug, NameDesc):
    stry = models.ForeignKey(Story,on_delete=models.CASCADE, related_name='sections')
     
class Chapter(DateTimeSlug, NameDesc):    
    sec = models.ForeignKey(Section,on_delete=models.CASCADE, related_name='chapters')

class Paragraph(DateTimeSlug):
    chap = models.ForeignKey(Chapter, on_delete=models.CASCADE, related_name='paragraphs')
    title = models.CharField(max_length=120)
    subtitle = models.CharField(max_length=180)
    body = models.TextField()

id = models.AutoField(primary_key=True) 不是必需的,因为 Django 会自动添加 id 和 AutoField。如果要使用自定义 PrimaryKey,则必须自己制作。我建议你可以在Story.stry 进行。不需要添加blank=False, null=False。这是 Django 的标准行为。

如果你想在yoru index-App中使用模型,你可以在需要的地方导入。

可以将这些划分为不同的应用程序,或者为每个流派有一个应用程序,或者将流派作为模型。

在我看来,我会在您的 Story-model 中添加一种“流派标签”并将它们放在一起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 2014-02-25
    • 1970-01-01
    相关资源
    最近更新 更多