我目前正在研究Django中的一个模型,该模型涉及一个模型,它可以具有各种不同的特征,具体取决于它是什么类型的对象.所以,假设我们有一个名为Mammal的模型,它可以是大象或海豚(分别具有自己的特征"tusk_length"和"flipper_length").
基本的OOP原则呼喊"多态",我倾向于同意.但是,由于我是Django的新手,我首先要知道它是否是在Django中这样做的最佳方式.我听说过很多例子和一些人对奇异巨型模特的偏好
我已经尝试过使用GenericForeignKeys,如下所述:我如何将Django的GenericForeignKey限制为模型列表?.虽然这个解决方案运行得很漂亮,但我不喜欢无法过滤,而且这种关系只是一种方式.也就是说,虽然你可以从哺乳动物物体中获得海豚,但你无法从海豚身上获得哺乳动物物体.
所以,这是我的两个选择:
选择A:
from django.db import models
class Mammal(models.Model):
hair_length = models.IntegerField()
tusk_length = models.IntegerField()
flipper_length = models.IntegerField()
animal_type = models.CharField(max_length = 15, choices = ["Elephant", "Dolphin"]
Run Code Online (Sandbox Code Playgroud)
选择B:
from django.db import models
class Mammal(models.Model):
hair_length = models.IntegerField()
class Elephant(Mammal):
tusk_length = models.IntegerField()
class Dolphin(Mammal):
flipper_length = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)
根据我的理解,选择B在查询和列出所有大象或海豚时具有更好的代码优势.但是,我注意到从哺乳动物列表中获取所有大象并不是那么简单(有没有查询?)而没有在类中放入animal_type,默认依赖于类.
这导致了我看到的多态性的另一个问题,在上面的例子或我的应用程序中都没有出现,但值得一提的是,如果不完全删除Dolphin,很难将Dolphin对象编辑成Elephant.
总的来说,是否有任何普遍的偏好,或者我不应该使用多态的任何重大原因?
我有这些模型:
class App(models.Model):
name = models.CharField(max_length=100)
class ProjectA(models.Model):
name = models.CharField(max_length=100)
app = models.ForeignKey(App)
class ProjectB(ProjectA):
pass
class Attachment(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
project = generic.GenericForeignKey("content_type","object_id")
file = models.FileField(upload_to=".")
Run Code Online (Sandbox Code Playgroud)
我正在为管理员注册所有模型,而我正在取消注册Group,User和Site.问题是,当我访问管理员中的附件时,我看到它呈现如下:

在内容类型选择中,我看到此列表:

Attachment具有GenericForeignKey的原因是因为ProjectA和ProjectB都需要访问它.我知道ProjectA和ProjectB是相同的,但要求它们存储在2个单独的表中.我怎么能从管理员那里使用Attachment类?我知道如何使用普通视图中的contenttypes,但不是来自管理员.
在Attachment类中,我只想选择项目A或项目B,然后选择所有项目A或所有项目B的列表,然后是我想要附加的文件.
管理员可以做这样的事吗?我是否需要向用户显示Object Id列?
假设我们有一个基本模型:
class BaseModel(models.Model):
pass
Run Code Online (Sandbox Code Playgroud)
有一些子类:
class Submodel1(BaseModel):
some_field = models.TextField()
...
class Submodel9(BaseModel):
another_field = models.TextField()
Run Code Online (Sandbox Code Playgroud)
每个子模型都在其自己的 Django 应用程序中定义。可以出现带有新子模型的新应用程序。
我们还有另一个模型,我们称之为RelatedModel,它应该与 具有一对一的关系BaseModel:
class RelatedModel(models.Model):
the_thing = models.OneToOneField(BaseModel, null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)
如果 ,是否可以定义这样的关系BaseModel.Meta.abstract == True?或者BaseModel根本没有定义?
我在下面发布了一些解决方案作为答案,但对我来说它们似乎有点难看。
如果我有两个模型
class modelA(models.Model):
# properties...
class modelB(models.Model):
# properties
Run Code Online (Sandbox Code Playgroud)
并且我想将两个模型images都放在一个字段中,那么我将如何编写图像模型?如果只是一个,那么我想它将是:
class Image(models.Model):
image = models.ForeignKey(modelA)
Run Code Online (Sandbox Code Playgroud)
因此,如果我还想modelB拥有图像,那将如何工作?我需要写ImageA和ImageB吗?