【问题标题】:How to save old IDs / reference numbers from several models?如何保存多个型号的旧 ID/参考号?
【发布时间】:2023-03-04 09:52:02
【问题描述】:

从多个模型中保存旧 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. 还有别的吗?

也许CommaSeparatedCharField 将值保留在模型本身中?

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

欢迎提出任何建议。

【问题讨论】:

  • 如果您已经拥有现有数据库,则第二个模型看起来不错。如果它们是唯一的,您可以使用 One2One 关系

标签: django django-models foreign-keys


【解决方案1】:

这取决于那里有多少旧参考。

如果只有几个旧参考号,您可以使用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

【讨论】:

  • 如果您确定只有 2 个模型用于旧参考,您可以使用 2 个外键,但它不能扩展。如果您想要许多模型的参考,您绝对应该使用通用外键
猜你喜欢
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多