Определение связи поля с абстрактной моделью

#python #django #django-models

#python #django #django-модели

Вопрос:

Я просто сдался после нескольких часов попыток протестировать определение отношения с помощью абстрактной модели, я попробовал полиморфный, но безуспешно, я также попробовал 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, я не был уверен, что делать с моей моделью «Домена» и как ее изменить, и, как вы знаете, я получаю сообщение об ошибке ниже [при 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:

Хорошо, простой ответ таков: «вы не можете исправить то, что вы делаете» — у вас просто не может быть поля внешнего ключа для чего-то, что не является реальным (абстрактное поле TemplateField означает, что оно не будет сгенерировано).

Я думаю, вопрос в том, должно ли TemplateField быть абстрактным. Django довольно хорошо справляется с наследованием для моделей, это означает, что у вас есть дополнительная таблица Db, но она будет работать «нормально».

Вы могли бы рассмотреть возможность добавления дополнительной функциональности в TemplateField, чтобы вы знали, «какого рода поле шаблона», т. Е. Если вы попытаетесь загрузить поле Templatefield ‘3’, оно узнает свой домен и вернет его — все зависит от того, собираетесь ли вы разрешить экземпляру иметь наследование шаблона несколькими типами.