Django多对多关系。使用不同于ID(主键)的ID号连接两个表

时间:2019-01-30 14:38:59

标签: django python-3.x postgresql

我试图建立一个由两个表组成的关系数据库。 在建立具有多对多关系的数据库时,我没有任何问题。但是问题在我更改主键时就开始了

我需要向数据库输入旧数据。在其中一个列表中,我将有一个客户列表,在另一个实体列表中。客户应与多个实体建立关系。

例如:

Client A:
Entity 1
Entity 2
Entity 3

Client B:
Entity 6
Entity 1
Entity 2
Entity 8

Table of Clients:
Client A (identification number: 6582395)
Client B (identification number: 7866732)

Table of Entities:
Entity 1 (identification number: 6582395)
Entity 1 (identification number: 7866732)
Entity 2 (identification number: 6582395)
Entity 2 (identification number: 7866732)
Entity 3 (identification number: 6582395)
Entity 6 (identification number: 7866732)
Entity 8 (identification number: 7866732)

实体将重用于多个客户端。

诀窍是我有旧数据,其中我只能使用 “识别号:”。 我不知道该怎么做。如果我使用主键,那么我就不能拥有带有重复标识号的实体(这是我创建两个列表之间关系的唯一方法。

class Entities(models.Model):
    e_name = models.CharField(max_length=255)
    e_country = models.CharField(max_length=255)
    e_SAP_id = models.IntegerField(primary_key=False, unique=False)
    id = models.AutoField(primary_key=True, unique=True)

class Clients(models.Model):
    client_name = models.CharField('Clients full legal name', max_length=255)
    SAP_id = models.IntegerField(primary_key=True)
    c_country = models.CharField(max_length=255)
    creation_date = models.DateTimeField()
    c_structure = models.ManyToManyField(Entities, related_name='e_SAP_ids', blank=True)
    c_structure_string = models.TextField(default='')

如您所见,我正在尝试将e_SAP_id = models.IntegerField(primary_key = False,unique = False)设置为unique = False,但它不允许我这样做。我无法创建具有相同标识号的多个实体。

请帮助我。我不知道该怎么办...

提前谢谢

2 个答案:

答案 0 :(得分:0)

如果要集成现有数据库,则可以:

生成检查旧数据库的模型。

strnpcy(x, a == MACRO1 ? "S" : "K", 2 * (a == MACRO1 + a == MACRO2));

"items": [
    {
      "recipient_type": "EMAIL",
      "amount": {
        "value": "9.87",
        "currency": "USD"
      },
      "note": "Thanks for your patronage!",
      "sender_item_id": "201403140001",
      "receiver": "receiver2@example.com"
    },
    {
      "recipient_type": "EMAIL",
      "amount": {
        "value": "9.85",
        "currency": "USD"
      },
      "note": "Thanks for your patronage!",
      "sender_item_id": "201403140001",
      "receiver": "receiver@example.com"
    }

这是步骤:

  1. 配置您的Django项目以使用旧的数据库。
  2. 生成上面显示的模型。
  3. 根据需要迁移或伪造迁移。

参考:Integrating Django with a legacy database

答案 1 :(得分:0)

如果要导入数据(而不是连接到旧数据库),则导入脚本可以为其导入的每个实体关系即时创建关系。

我根本不会将e_SAP_id存储在Entity上(从Entity模型中删除该字段,因为那是Client的ID。只需添加关系:

for old_entity in old_entities: 
    c = Client.objects.get(SAP_id=old_entity['identification_number'])
    e = Entity.objects.get(name=old_entity['name'])  # if unique  
    # or maybe you should create the entity here:
    # e = Entity.objects.get_or_create(name=old_entity['name'], defaults={'country': old_entity['country']})
    c.entities.add(e)

# note: assumption is "entities" field on Client
class Client(Model):

     ...
     entities = models.ManyToManyField(Entities, related_name='clients', blank=True)