#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’, оно узнает свой домен и вернет его — все зависит от того, собираетесь ли вы разрешить экземпляру иметь наследование шаблона несколькими типами.