使用抽象模型定义字段关系

时间:2016-10-22 20:58:01

标签: python django django-models

我只是投降了几个小时后试图用抽象模型测试定义关系,我尝试了多态但没有运气,我也试过GenericForeignKey ..也没有运气,这是我的小代码

class Attribute(models.Model):
    name       = models.CharField(max_length=50)


class TemplateField(models.Model):
    name = models.CharField(null=True,blank=True,max_length=30)
    attributes = models.ManyToManyField(Attribute, through='AttributeValue')

    class Meta:
        abstract = True


class Domain(TemplateField):
    name = models.CharField(max_length=33)



class AttributeValue(models.Model):
    templatefield     = models.ForeignKey(TemplateField)
    attribute  = models.ForeignKey(Attribute)
    value      = models.CharField(max_length=50)

当我尝试GenericForeignKey时,我不知道如何处理我的" Domain"模型以及如何修改它,如您所知,我收到以下错误[while makemigrate]:

wiki.AttributeValue.templatefield: (fields.E300) Field defines a relation with model 'TemplateField', which is either not installed, or is abstract.
wiki.AttributeValue.templatefield: (fields.E307) The field wiki.AttributeValue.templatefield was declared with a lazy reference to 'wiki.templatefield', but app 'wiki' doesn't provide model 'templatefield'.
wiki.AttributeValue: (fields.E336) The model is used as an intermediate model by 'wiki.Domain.attributes', but it does not have a foreign key to 'Domain' or 'Attribute'.

1 个答案:

答案 0 :(得分:2)

好的,简单的答案是“你无法修复你正在做的事情” - 你不能在一些不真实的东西上有一个外键字段(TemplateField是抽象意味着它不会被生成)。

我认为问题是,TemplateField 是否是抽象的。 Django很好地处理模型的继承,它确实意味着你有额外的Db表,但它可以正常工作。

您可以考虑向TemplateField添加更多功能,以便您了解'什么类型的模板字段',即如果您尝试加载Templatefield'3',它知道它的域并返回它 - 这一切都取决于您是否打算允许实例ot具有多种类型的模板继承。