0

我正在尝试设计一个包含字段的抽象模型。子类模型将具有此字段,但它们将具有各种字段类型。

例子

class AbsModel(models.Model):
    data = models.??? #I want subclasses to choose this

    def __unicode__(self):
        return data.__str__()

    class Meta:
        abstract = True

class TimeModel(AbsModel):
    data = models.TimeField()
    ...

class CharModel(AbsModel):
    data = models.CharField(...)
    ...

我正在寻找一种方法来强制数据字段的存在,以便我可以为所有对象编写一次unicode 。

如果这不可能,我如何在调用超类的unicode时引用子类的“数据”字段

我觉得第二个问题有一个我想念的明显答案。

4

3 回答 3

0

你可以这样写:

class AbsModel(models.Model):
    def __unicode__(self):
        if hasattr(self, "data") and isinstance(self.data, models.Field):
            return data.__str__()
        return u"Unknown"
于 2012-06-01T08:46:51.683 回答
0

不能在 Django 中这样做

在正常的 Python 类继承中,允许子类覆盖父类的任何属性。在 Django 中,这对于作为实例的属性是不允许的Field(至少目前不允许)。如果基类有一个名为 author 的字段,则不能在从该基类继承的任何类中创建另一个名为 author 的模型字段。

覆盖父模型中的字段会导致诸如初始化新实例(指定正在初始化的字段Model.__init__)和序列化等领域的困难。这些是普通 Python 类继承不必以完全相同的方式处理的特性,因此 Django 模型继承和 Python 类继承之间的区别不是任意的。

[...]

FieldError如果您覆盖任何祖先模型中的任何模型字段,Django 将引发 a 。

于 2012-06-01T08:53:19.023 回答
0

无法覆盖字段类型为 models.Field 的超类字段。

https://docs.djangoproject.com/en/1.4/topics/db/models/#field-name-hiding-is-not-permitted

您可以通过在超类中定义另一种类型的字段来解决此问题,然后在子类中覆盖它(可能包括一个__str__()方法,以防数据字段未被覆盖)。

from django.db import models


class AbsDataField:
    def __str__(self):
        return "undefined"

class AbsModel(models.Model):
    data = AbsDataField

    def __unicode__(self):
        return self.data.__str__()

    class Meta:
        abstract = True

class TimeModel(AbsModel):
    data = models.TimeField()
    #...

class CharModel(AbsModel):
    data = models.CharField(max_length=32)
    #...
于 2012-06-01T08:58:41.663 回答