我想讨论使用genericralation和genericForeignkey的情况。
我有两种模型,公寓和任务。我需要创建将连接到公寓或任务的锁定码模型。我已将通用外国键添加到锁定码,并在公寓和任务中添加了通用关系:
class LockCode(TimeStampedModel):
context_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
context_id = models.PositiveIntegerField()
context = GenericForeignKey('context_type', 'context_id')
class Mission(DirtyFieldsMixin, models.Model):
lock_codes = GenericRelation(
LockCode,
content_type_field='context_type',
object_id_field='context_id',
related_query_name='mission'
)
class Appartment(DirtyFieldsMixin, models.Model):
lock_codes = GenericRelation(
LockCode,
content_type_field='context_type',
object_id_field='context_id',
related_query_name='appartment'
)
它可以正常工作。但增加了与添加2个外国人相比的复杂性级别,以进行公寓和任务。
class LockCode(TimeStampedModel):
appartement = models.ForeignKey(Appartement, null=True, blank=True)
mission = models.ForeignKey(Mission, null=True, blank=True)
所以我应该保留GFK或使用2个简单的FK?
如果使用第二个选项,则必须以逻辑构建以确保appartement
或mission
不是null
。如果您要添加更多这样的外国关键领域,那么这种逻辑将变得越来越复杂。
如果您确定自己永远不会添加更多的外键,并且您不介意确保其中一个不是null
的开销通用关系。
复杂性并非全部发生在字段定义中。它也在查询时间发生:鉴于锁定码,您如何确定它属于公寓还是任务?使用两个外键,您需要每次检查并捕获任何例外。
如果您永远不需要以这种方式遵循这种关系,那么是的,GFK是不必要的,两个FK会更好。