1

我正在尝试完成以下任务:

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

我明白为什么这不起作用。因为下载内容的摘要。

是否有为内容类型字段指定中间模型的解决方法?

4

2 回答 2

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内置动态创建新的具体类来实现这一点(当与不同的 CMS 基础(例如和)一起DownloadContentFiles使用时,请注意名称冲突)。DownloadContentpage.Pageelephantblog.Entry

也许是实现您想要的更简单的方法:

  • Downloads在某处添加模型,然后将其添加files ManyToManyField到此类
  • DownloadContent唯一包含一个ForeignKey(Downloads)

是的,你需要另一个模型。这可能是值得的,因为您可以为 构建更好的编辑界面Downloads,并且页面编辑器也得到了简化,因为您只需选择一个已经存在的Downloads模型即可在页面上显示它们。

于 2013-04-04T09:33:12.063 回答
0

也许明确定义class_namecreate_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")
于 2013-04-04T09:31:22.400 回答