相关疑难解决方法(0)

Django - 多态模型还是一个大模型?

我目前正在研究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.

总的来说,是否有任何普遍的偏好,或者我不应该使用多态的任何重大原因?

django polymorphism model django-models

12
推荐指数
1
解决办法
2988
查看次数

如何使用admin中的contenttypes自定义模型的显示?

我有这些模型:

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列?

django django-models django-admin django-contenttypes

6
推荐指数
1
解决办法
2914
查看次数

Django OneToOneField 到多个模型

假设我们有一个基本模型:

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根本没有定义?

我在下面发布了一些解决方案作为答案,但对我来说它们似乎有点难看。

django model abstract

5
推荐指数
1
解决办法
3416
查看次数

带有多个模型的ForeignKey

如果我有两个模型

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拥有图像,那将如何工作?我需要写ImageAImageB吗?

python django django-models django-rest-framework

3
推荐指数
1
解决办法
604
查看次数