2

我有一个以下抽象类

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'

但是当我尝试在 shell 命令中创建实例时,在创建映射实例时出现错误

“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

我该如何处理?

4

2 回答 2

3

您需要使用以下方法创建对象:

Mapping(
   category=cat1,
   content=ContentType.objects.get_for_model(car1),
   object_id=car.id
)

顺便说一句,我会命名该字段content_type而不是content避免歧义。有关详细信息,请参阅官方文档

于 2016-03-28T08:31:16.897 回答
0

您应该使用contentObject参数来填充模型对象作为 GenericForeignKey 而不是content.

像这样的东西应该工作:

Mapping(category=cat1, contentObject=car1)

于 2016-03-28T08:31:25.273 回答