DocumentChooserBlocks 必须有外键吗?
Do DocumentChooserBlocks have to have foreign key?
我正在使用 Wagtail streamfield 允许用户上传和link到编辑器界面中的文档。最初,我尝试使用文档中引用的外键以及我见过的所有其他示例。当 运行 迁移 wagtail 文档没有 属性 "set name" 时,我一直收到错误消息。所以我决定不使用外键,因为为了我们的目的,这些文件不一定需要以一对多的关系相关。所以在我的模型中,我没有为所有使用 DocumentChooserBlocks 的字段使用外键,一切似乎都运行良好。我是不是误解了 "foreign key" 并犯了一个错误(或实践糟糕的数据库设计)。这是我的工作模型:
class AgendaPage(Page):
author= models.CharField(max_length=255)
date = models.DateField('Post date')
mtg_date = models.DateField(default=datetime.date.today)
mtg_time = models.CharField(max_length=255, default ='10:00 AM')
full_video_url-models.CharField(required =False)
###full_audio = DocumentChooserBlock(required=False)
###mtg_transcript = DocumentChooserBlock(required=False)
])
agenda = StreamField([
('agenda_item', blocks.StreamBlock([
('item_title', blocks.TextBlock()),
('item_text', blocks.TextBlock()),
('mtg_doc', blocks.StructBlock([
('mtg_doc_upload', DocumentChooserBlock(required=True)),
('submitted_late', blocks.BooleanBlock(required=False, help_text='Submitted Late')),
('heldover', blocks.BooleanBlock(required=False, help_text='Held Over')),
('heldover_from', blocks.DateBlock(required=False, help_text="Held Over From")),
])),
('item_audio', DocumentChooserBlock(required=False)),
]))
])
content_panels = Page.content_panels + [
FieldPanel('author'),
FieldPanel('date'),
FieldPanel('mtg_date'),
FieldPanel('mtg_time'),
StreamFieldPanel('agenda'),
]
此外,在模型中的两条注释掉的行中,我试图让一个不在流域内的 DocumentChooserBlock(没有外键)我知道这种语法可能是错误的,正如我看到的所有示例,在模型定义中定义外键,然后在面板定义中引用 DocumentChooser 面板。没有外键是否可以(或建议)这样做?
DocumentChooserBlock 从不与外键一起使用。将文档附加到页面有两种不同的方法,您可以选择其中一种:
A ForeignKey
到文档,在 content_panels
中有一个 DocumentChooserPanel
。当您从页面到文档具有一对一或多对一关系时,将使用此方法;例如,ProductPage,其中产品具有 PDF 数据 sheet。这在数据库级别的两个对象之间创建了一个正式的 link。
一个 StreamField
里面有一个 DocumentChooserBlock
。这用于更灵活的安排,其中文档 link 可以出现在页面下方的任何位置。在数据库级别没有正式关联 - 从数据库的角度来看,StreamField 只是自由文本。这意味着不需要外键。
我正在使用 Wagtail streamfield 允许用户上传和link到编辑器界面中的文档。最初,我尝试使用文档中引用的外键以及我见过的所有其他示例。当 运行 迁移 wagtail 文档没有 属性 "set name" 时,我一直收到错误消息。所以我决定不使用外键,因为为了我们的目的,这些文件不一定需要以一对多的关系相关。所以在我的模型中,我没有为所有使用 DocumentChooserBlocks 的字段使用外键,一切似乎都运行良好。我是不是误解了 "foreign key" 并犯了一个错误(或实践糟糕的数据库设计)。这是我的工作模型:
class AgendaPage(Page):
author= models.CharField(max_length=255)
date = models.DateField('Post date')
mtg_date = models.DateField(default=datetime.date.today)
mtg_time = models.CharField(max_length=255, default ='10:00 AM')
full_video_url-models.CharField(required =False)
###full_audio = DocumentChooserBlock(required=False)
###mtg_transcript = DocumentChooserBlock(required=False)
])
agenda = StreamField([
('agenda_item', blocks.StreamBlock([
('item_title', blocks.TextBlock()),
('item_text', blocks.TextBlock()),
('mtg_doc', blocks.StructBlock([
('mtg_doc_upload', DocumentChooserBlock(required=True)),
('submitted_late', blocks.BooleanBlock(required=False, help_text='Submitted Late')),
('heldover', blocks.BooleanBlock(required=False, help_text='Held Over')),
('heldover_from', blocks.DateBlock(required=False, help_text="Held Over From")),
])),
('item_audio', DocumentChooserBlock(required=False)),
]))
])
content_panels = Page.content_panels + [
FieldPanel('author'),
FieldPanel('date'),
FieldPanel('mtg_date'),
FieldPanel('mtg_time'),
StreamFieldPanel('agenda'),
]
此外,在模型中的两条注释掉的行中,我试图让一个不在流域内的 DocumentChooserBlock(没有外键)我知道这种语法可能是错误的,正如我看到的所有示例,在模型定义中定义外键,然后在面板定义中引用 DocumentChooser 面板。没有外键是否可以(或建议)这样做?
DocumentChooserBlock 从不与外键一起使用。将文档附加到页面有两种不同的方法,您可以选择其中一种:
A
ForeignKey
到文档,在content_panels
中有一个DocumentChooserPanel
。当您从页面到文档具有一对一或多对一关系时,将使用此方法;例如,ProductPage,其中产品具有 PDF 数据 sheet。这在数据库级别的两个对象之间创建了一个正式的 link。一个
StreamField
里面有一个DocumentChooserBlock
。这用于更灵活的安排,其中文档 link 可以出现在页面下方的任何位置。在数据库级别没有正式关联 - 从数据库的角度来看,StreamField 只是自由文本。这意味着不需要外键。