【问题标题】:Organising complicated Django models组织复杂的 Django 模型
【发布时间】:2013-08-08 18:13:48
【问题描述】:

我目前正在为客户构建一个应用程序,其中每条记录都有大量不同的信息(大约 50-60 个字段)与之关联。

我想将模型分成多个部分,以便数据更有条理。

我的第一次尝试是做这样的事情:

class Program(models.Model):
    class BookingInformation(models.Model):
        program = models.OneToOneField('Program', related_name='booking_information')

        producer = models.CharField(max_length=100, blank=True)
        producer_phone = models.CharField(max_length=30, blank=True)

        ...

    class Editorial(models.Model):
        program = models.OneToOneField('Program')

        series = models.CharField(max_length=100, blank=True)

        ...

我有 5 个左右的部分,其中一些是嵌套的。

这样我就可以拥有一个程序对象并执行program.booking_information.producer 来获取该字段。此外,我可以更轻松地使用 ModelForm 为每个部分设置单独的表单(我想要的)。

当我创建对象时出现了困难。因为当我创建一个 Program 对象时, Program.BookingInformation 对象还不存在,如果不先保存 Program 就无法创建它(因此它会获得一个主键)。然后我会在不是绝对必要的时候阅读this which appear to discourage the use of OneToOneFields 之类的内容。

我应该把所有东西都放在一个模型中吗?一张包含所有这些字段的大表对我来说似乎很乱,但是我对这个数据库的东西还很陌生。

【问题讨论】:

  • Zen of Python - 扁平比嵌套更好。另外,我怀疑这里是否真的需要嵌套模型。
  • @karthikr 你愿意详细说明原因吗?
  • 无论模型多么复杂,我都认为不需要嵌套模型。你可以重新考虑它并建立一个扁平的结构。如果不了解应用程序/查看模型,很难说出要更改的内容

标签: database django django-models


【解决方案1】:

在数据库级别上,对与单个模型一对一相关的数据使用单独的表是一个坏主意。在这些单独的表中查询将需要两倍的查询量,从而减慢您的应用程序并使这些模型的使用复杂化。一般来说,您不希望有尽可能少的查询。

有可能的是,将不同的数据“组”划分为您都继承自的单独抽象模型:

class BookingInformation(models.Model):
    # fields

    class Meta:
        abstract = True

class Program(BookingInformation, Editorial, etc.):
    pass

它可能会使您的代码更具可读性,但我并没有真正看到这样做的明显优势,如果您在模型中需要更高级的逻辑,您可能会遇到问题。我建议您将所有内容都放在一个类中,并用空行和 cmets 等在组之间进行视觉区分。

要获得所需的单独表单,您可以指定多个 ModelForm 类,每个类都定义了自己的 fields 选项:

class BookingInformationForm(forms.ModelForm):
    class Meta:
        fields = ['producer', 'producer_phone', etc]

这将需要模型的大多数(如果不是所有)字段都具有 null=Trueblank=True,具体取决于特定字段,以防止在创建具有仅包含字段子集的表单的模型时出现问题的模型。

【讨论】:

  • 我在考虑抽象类的多重继承,但我同意,如果我需要编写查看来自不同部分的数据的方法,它会变得混乱。这是一张巨大的桌子!
猜你喜欢
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 2023-04-01
  • 2013-06-03
  • 2020-04-04
  • 2019-01-05
相关资源
最近更新 更多