0

我正在研究假设与许多不同模型相关的模型,但一个实例应该只与其中一个模型相关。像模型响应一样,它应该存储在字段上解析的响应主体,但是这个响应可以来自具有不同字段集的不同站点。

通过 SO 搜索我发现使用 django GenericRelation 是一个很好的方法,所以我尝试如下:

class Response(models.Model):
   content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
   object_id = models.PositiveIntegerField()
   service_data = GenericForeignKey("content_type", "object_id")

class ServiceOne(models.Model):
    field1 = models.CharField(...)

class ServiceTwo(models.Model):
    field2 = models.CharField(...)

对于这些模型,我想做这样的事情:

s1 = ServiceOne.objects.create(field1="Foo")
s2 = ServiceTwo.objects.create(field1="Bar")
r1 = Response.objects.create(service_data=s1)
r2 = Response.objects.create(service_data=s2)

但它是扔的django.db.utils.IntegrityError: null value in column "content_type_id" violates not-null constraint

像“Add null=True”这样的解决方案(在这里Django Make ContentType Not Required)不是我所期望的,因为我希望这种关系成为,而不是摆脱错误本身。

根据https://docs.djangoproject.com/en/3.2/ref/contrib/contenttypes/它应该可以正常工作,但我想我错过了一些东西。

我尝试将此添加到 ServiceOne 和 ServiceTwo

    response = GenericRelation(
    Response,
    content_type_field='content_type_fk',
    object_id_field='object_primary_key',
    )

model_type = ContentType.objects.get(
app_label='actual_app_label',
model="serviceone"
)
s1 = ServiceOne.objects.create(field1="Foo")
r1 = Response.objects.create(
    service_data=s1,
    content_type=model_type,
)

但它没有给出任何不同的结果。

4

0 回答 0