Общий внешний ключ в Django, показывающий ошибку, должен быть экземпляром типа контента
У меня есть следующий абстрактный класс
class Manufacturer(models.Model):
company=models.CharField(max_length=255)
class Meta:
abstract = True
Теперь 2 класса наследуют сверху:-
class Car(Manufacturer):
name = models.CharField(max_length=128)
class Bike(Manufacturer):
name = models.CharField(max_length=128)
Теперь я хочу связать их с функциями, поэтому я создаю следующие классы:-
class Feature(models.Model):
name= models.CharField(max_length=255)
limit=models.Q(model = 'car') | models.Q(model = 'bike')
features = models.ManyToManyField(ContentType, through='Mapping',limit_choices_to=limit)
class Mapping(models.Model):
category=models.ForeignKey(Category, null=True, blank=True)
limit=models.Q(model = 'car') | models.Q(model = 'bike')
content = models.ForeignKey(ContentType, on_delete=models.CASCADE,limit_choices_to=limit,default='')
object_id = models.PositiveIntegerField(default=1)
contentObject = GenericForeignKey('content', 'object_id')
class Meta:
unique_together = (('category', 'content','object_id'),)
db_table = 'wl_categorycars'
Но когда я пытаюсь создать экземпляры в командах оболочки, я получаю ошибку при создании экземпляра отображения
"Mapping.content" должен быть экземпляром "ContentType".
car1=Car(company="ducati",name="newcar")
bike1=Bike(company="bike",name="newbike")
cat1=Category(name="speed")
mapping(category=cat1, content=car1) # ---> i get error at this point
Как мне поступить с этим?
2 ответа
Решение
Вам нужно создать свой объект с помощью:
Mapping(
category=cat1,
content=ContentType.objects.get_for_model(car1),
object_id=car.id
)
Кстати, я бы назвал поле content_type
вместо content
чтобы избежать двусмысленности. Смотрите официальную документацию для получения дополнительной информации.
Вы должны использовать contentObject
параметр для заполнения объектов модели как GenericForeignKey вместо content
,
Примерно так должно работать:
Mapping(category=cat1, contentObject=car1)