如何从多个模型中保存旧ID /参考编号?

时间:2015-10-12 12:43:15

标签: django django-models foreign-keys

从多个模型中保存旧ID /参考编号的最佳概念方法是什么?

例如:

 class Project(models.Model):
     reference_number = models.CharField(_('Project ID'), max_length=16,
        unique=True)

 class Offer(models.Model):
     reference_number = models.CharField(_('Offer ID'), max_length=16,
        unique=True)

我的想法:

  1. 每个模型的分离模型

    class OldProjectNumber(models.Model):
        project = models.ForeignKey(Project)
        old_number = models.CharField(_('Old ID'), max_length=16,
            unique=True)
    
    ...
    
  2. 所有型号的一个型号?

    class OldNumber(models.Model):
        project = models.ForeignKey(Project)
        offer = models.ForeignKey(Offer)
        old_number = models.CharField(_('Old ID'), max_length=16,
            unique=True)
    
  3. 还有别的吗?

  4. 可能需要CommaSeparatedCharField来保留模型本身的值吗?

    我需要能够搜索/过滤每个模型的旧参考编号。

    任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:0)

这取决于将有多少旧参考。

如果只有几个旧的参考号,你可以使用CommaSeparatedCharField,但在此你必须指定max_length,这将把它限制为很少的参考号,并在将来的任何时候引起问题。

我建议您使用文本字段并使用json格式的字符串来存储旧引用列表。

如果参考编号的数量可能会很大,您应该使用一个模型来存储参考编号。

此外,不应为每个模型使用外键,而应使用将映射到所有其他模型的通用外键。

from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
from django.contrib.contenttypes.models import ContentType

class OldNumber(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

和模型本身的通用关系。

old_reference = GenericRelation('OldNumber', related_query_name='model_name')  # related_query_name for reverse querying