问题描述
我在为一个应用程序构建数据库架构时遇到问题,该应用程序包括带有图像的模型,并且已预先加载了一些默认数据。这个想法是,应用程序启动时会使用默认数据(静态图片)进行预填充,但之后用户可以上传自己的图片。
为简化起见,假设模型只有两个字段-shared_one
和image
:
class Some(models.Model):
shared_one = models.CharField()
image = [???]
我尝试将image
定义为FileField
,但不适用于静态文件-在创建新记录Some
时,模型将尝试将新文件image
保存到MEDIA_ROOT
目录。
然后我发现Django引入了用于管理模型中的静态文件的字段类型-FilePathField,但显然它不符合用户上传的文件。
然后我想到了将Some
做成这样的抽象类的想法:
class Some(models.Model):
class Meta:
abstract = True
shared_one = models.CharField()
class DefaultSome(Some):
media = models.FilePathField()
class UseRSSome(Some):
media = models.FileField()
该方法的问题在于,DefaultSome
和UseRSSome
现在已经完全不同了-例如,我无法使用media
到{{1 }},我需要为每个将使用ForeignKey
的新模型创建不同的模型集(和数据库表),这似乎效率极低。
我也尝试将Some
创建为非托管模型,但是它根本不起作用。具有这样定义的模型:
media
Some
但是它失败,并显示错误:class Some(models.Model):
class Meta:
managed = False
shared_one = models.CharField()
class DefaultSome(Some):
media = models.FilePathField()
class UseRSSome(Some):
media = models.FileField()
。 (???)
我的数据结构设计不当吗?我应该使用完全不同的方法吗?
解决方法
可能已执行了伪迁移。打开数据库打开表your_project.django_migrations
,然后搜索创建模型的迁移文件名。 从表中删除该迁移记录,然后再次执行迁移。