如何在Django的多对多关系中向数据透视表添加更多列?

人气:424 发布:2022-10-16 标签: python django many-to-many python-3.x

问题描述

我有两个通过多对多关系联合起来的模型,在本例中是保单和承保范围,到目前为止它工作得很好,但我想向数据透视表添加另一个列,因为它不能在任何模型化的表上工作(我想添加一个名为‘Amount’的整数字段,这样我就可以存储我们为该特定保险警察的特定承保范围承保了多少钱)

class Policy(models.Model):
    """Insurance Policies Model"""

    number = models.CharField(max_length=25, unique=True)
    company = models.OneToOneField(Company, on_delete=models.CASCADE)
    client = models.OneToOneField(Client, on_delete=models.CASCADE)
    start_date = models.DateField()
    end_date = models.DateField()
    comission = models.PositiveIntegerField()
    salesperson = models.ForeignKey(Salesperson, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    rif = models.CharField(max_length=50)
    phone = models.CharField(max_length=100)
    class Meta:
        db_table = 'policies'

class Coverage(models.Model):
    """Coverage of the different types of policies"""
    name = models.CharField(max_length=55)
    policies = models.ManyToManyField(Policy)
    class Meta:
        db_table = 'coverages'

我做了迁移,创建的数据透视表没有问题,但我不知道如何在数据透视表中添加另一个字段

推荐答案

您可以为其指定through=... parameter [Django-doc]。事实上,如果您不自己指定这一点,Django会自动创建一个"隐式模型"。例如:

class Policy(models.Model):
    # ...

class Coverage(models.Model):
    # ...
    policies = models.ManyToManyField(Policy, through='CoveragePolicy')

class CoveragePolicy(models.Model):
    policy = models.ForeignKey(Policy, on_delete=models.CASCADE)
    coverage = models.ForeignKey(Coverage, on_delete=models.CASCADE)
    amount = models.IntegerField()

因此,现在您可以使用

在策略p1和覆盖范围c2之间创建关系对象
CoveragePolicy.objects.create(policy=p1, coverage=c2, amount=1)

您可以使用

获取策略p1的相关CoveragePolicy对象集:
p1.coveragepolicy_set.all()

,然后检查amount及其相关的coverage

但是,Django在从现有直通模型迁移到另一个模型时会遇到问题,因此您可能需要删除迁移文件,并使用新模型创建新的迁移文件(并撤消旧模型数据库中的更改)。

789