创建通用外键的最简单情况是这样的:
class ModelWithGFK(models.Model):
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
但在我的情况下,我可以从中推断出其他字段的内容类型,因此添加content_type
FK 既多余又容易随着时间的推移而导致不一致。所以我尝试了这个:
class ModelWithGFK(models.
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
@property
def content_type(self):
# Figure out wich content type this instance should have FK to
return ContentType.objects.get(..........)
但似乎 GFK 类只接受内容类型参数作为外键:
def _check_content_type_field(self): """ Check if field named `field_name` in model `model` exists and is a valid content_type field (is a ForeignKey to ContentType). """
是否有解决方法(可能通过覆盖 GFK 及其一些方法,例如get_content_type
),或者我会放弃,添加 FK 并一直生活在对不一致和知道这种(微小)不可避免的冗余的痛苦中的恐惧?