根据子类对象(__str__)更改不带字段的超类表示



我正在运行一个django应用程序,设置如下:

ModelSuper(models.Model):
class Meta:
abstract = False
ModelSub1(ModelA):
name = models.CharField(...)

def __str__:
return self.name
ModelSub2(ModelA)
name = models.CharField(...)
def __str__:
return self.name

ModelForeign(models.Model):
element = models.ForeignKey(ModelA)
def __str__:
return self.name

因此CCD_ 1与CCD_。现在发生的情况是,当我创建ModelForeign的实例时,我可以选择它是属于ModelSub1还是属于ModelSub2。但是字符串表示是ModelSuper Onject (3),其中(3(是id。

通常,我可以通过覆盖模型上的__str__方法来更改此表示,但由于Supermodel上没有任何字段,我无法返回任何内容。

我尝试过的:

  • 我已经在子模型中实现了__str__方法,但这没有帮助
  • 我想把超级模型抽象化。但这并不能让我把FK指向超模,所以我不能这样做。我的设置需要此FK
  • 我在django的ContentType框架中使用了一个通用的FK。这也不是一个选项,因为它完全扰乱了我的应用程序,从SQL的角度来看也不推荐使用

此外,当我执行API调用时,我会返回ModelSuper Onject (3),而不是一个可供人类使用的名称。

有办法做我打算做的事吗?提前感谢您的帮助和提示。非常感谢!

第1版:多亏了阿卜杜勒的帮助,我尝试了什么:

class ModelA(models.Model):
class Meta:
abstract = False
TYPE_CHOICES = [('sub1', 'sub1'), ('sub2', 'sub2')]
type_model = models.CharField(max_length=50, choices=TYPE_CHOICES, null=True, blank=True)
def __str__(self):
if self.type_model == "sub1":
return "sub1"
elif self.type_model == "sub2":
return "sub2"
else:
return "unkown"

我不明白外键是如何工作的,因为模型继承意味着表是独立的。试试这样的东西怎么样:-

ModelA(models.Model):
TYPE_CHOICES = [('Sub1', 'ModelSub1'), ('Sub2', 'ModelSub2')]
model_type = models.CharField(max_length=4, choices=TYPE_CHOICES)
def __str__:
# Return string representation using if-else
class Meta:
abstract = False
ModelSub1(ModelA):
name = models.CharField(...)
model_a = models.ForeignKey(ModelA, on_delete=models.CASCADE)

def __str__:
return self.name
ModelSub2(ModelA)
name = models.CharField(...)
model_a = models.ForeignKey(ModelA, on_delete=models.CASCADE)
def __str__:
return self.name

ModelForeign(models.Model):
element = models.ForeignKey(ModelA)
def __str__:
return self.name

相关内容

最新更新