1

我目前正在为客户构建一个应用程序,其中每条记录都有大量与之相关的不同信息(大约 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 就无法创建它(因此它会获得一个主键)。然后我读到这样的东西,它们似乎不鼓励在不是绝对必要时使用 OneToOneFields。

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

4

1 回答 1

1

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

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

class BookingInformation(models.Model):
    # fields

    class Meta:
        abstract = True

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

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

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

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

这将需要模型的大多数(如果不是所有)字段都具有,null=True或者blank=True,根据特定字段,以防止在创建具有仅具有模型字段子集的表单的模型时出现问题。

于 2013-08-08T19:09:56.803 回答