我正在努力完成以下任务:
class DownloadContentFiles(models.Model):
download_content = models.ForeignKey('DownloadContent')
media_file = models.ForeignKey(MediaFile)
class DownloadContent(models.Model):
files = models.ManyToManyField(MediaFile, through=DownloadContentFiles)
class Meta:
abstract=True
我可以看出为什么这不起作用。因为DownloadContent上的摘要。
是否有解决方法为contenttype字段指定中间模型?
答案 0 :(得分:1)
通常,如果在创建字段(例如选择列表)或具体的Django模型时(如果需要)需要更多信息,则可以使用initialize_type
。
class DownloadContent(models.Model):
@classmethod
def initialize_type(cls):
cls.add_to_class('files', ... your model field ...)
MediaFileContent
使用此方法添加type
选择器:
https://github.com/feincms/feincms/blob/master/feincms/content/medialibrary/models.py#L58
然而,在您的情况下,这不起作用,因为您还必须动态创建through
模型。这样做的原因是,对于每个具体的DownloadContent
,您需要另一个具体的DownloadContentFiles
模型。
您可以通过使用type
内置动态创建新的DownloadContentFiles
具体类来实现此目的(当使用具有不同CMS基础的DownloadContent
时要小心名称冲突,例如{{1 }和page.Page
)。
也许是一种更简单的方法来实现您的目标:
elephantblog.Entry
模型,然后将Downloads
files
添加到此类ManyToManyField
仅包含DownloadContent
是的,你需要另一种型号。这可能是值得的,因为您可以为ForeignKey(Downloads)
构建更好的编辑界面,并且页面编辑器也被简化,因为您只需选择一个已存在的Downloads
模型在页面上显示它们
答案 1 :(得分:0)
明确定义class_name
到create_content_type可能对您有用。像这样:
class DownloadContentFiles(models.Model):
download_content = models.ForeignKey('MyDownloadContent')
media_file = models.ForeignKey(MediaFile)
class DownloadContent(models.Model):
files = models.ManyToManyField(MediaFile, through=DownloadContentFiles)
class Meta:
abstract=True
Page.create_content_type(DownloadContent, class_name="MyDownloadContent")