我正在研究假设与许多不同模型相关的模型,但一个实例应该只与其中一个模型相关。像模型响应一样,它应该存储在字段上解析的响应主体,但是这个响应可以来自具有不同字段集的不同站点。
通过 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,
)
但它没有给出任何不同的结果。