Django GenericForeignKey与ForeignKey集

时间:2019-07-05 08:44:33

标签: django foreign-keys generic-foreign-key

我想讨论使用GenericRelation和GenericForeignKey的情况。

我有2个模型,即Appartement和Mission。我需要创建将与Appartment或Mission连接的LockCode模型。我已将GenericForeignKey添加到LockCode中,并将GenericRelation添加到了Appartement和Mission中:

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?

2 个答案:

答案 0 :(得分:1)

如果使用第二个选项,则必须建立逻辑以确保appartementmission都不是null。如果您要添加更多此类外键字段,则此逻辑将变得越来越复杂。

如果您确定永远不会添加更多外键,并且不介意确保其中一个不是null的开销,则可以继续使用外键,但可伸缩我会坚持通用关系。

答案 1 :(得分:1)

并不是所有的复杂性都在字段定义中发生。它也发生在查询时:给定一个LockCode,您如何识别它是属于公寓还是任务?使用两个外键,您需要每次都检查一次并捕获任何异常。

如果您永远不需要那样的关系,那么是的,GFK是不必要的,两个FK会更好。