首页 > 解决方案 > make 模式在创建时继承多个外键

问题描述

我有 2 个模型命名:PaymentModeStore as

PaymentMode 模型:(id 将由 django 自动生成)

id = model.IntegerField(primarykey)
name = model.CharField("eg: cash, debit, credit")

商店模型:(id 将由 django 自动生成)

id = model.IntegerField(primarykey)
payment_mode = model.ForeignKey(Paymentmode, on_delete=model.cascade)
mode_credit_value = model.IntegerField(default=0)
name = model.CharField()
... some other fields

所以我想要的是每当创建商店时,所有支付模式都会自动继承,继承所有外键,这将在商店表中创建多行:(如果添加了 id 为 1 的商店,1 为 3 行,其他类似)

store_id | payment_mode | name
------------------------------
1             1           abcd
1             2           abcd
1             3           abcd
... similarly if store id 2 is passed, all master are inherited
2             1           xyz
2             2           xyz
2             3           xyz

我查看了各种stackoverflow问题,可能这可能是重复的,但是所有这些都覆盖了保存功能并只制作一个继承的对象,例如:

Stackoverflow问题

所以问题是上述问题中的保存函数覆盖方法会继承所有外键吗?还是只会做一个?
显然,支付模式将首先被创建。另外,将来如果添加付款方式,是否可以自动为所有现有商店添加新的付款方式?
可能我创建模型的方法是错误的。

标签: djangodjango-models

解决方案


由于这是多对多的关系(一个商店可以有多种支付方式,一种支付方式可以附加到多个商店)。所以你应该使用 ManyToMany 字段。

所以商店模型将是:

class Store(models.Model):
      payment_modes = models.ManytoManyField(PaymentMode)

更新:

要在模型中添加所有支付方式Store,您可以覆盖该save方法。

def save(self, *args, **kwargs):
    instance = super().save(*args, **kwargs)
    instance.payment_modes.add(*PaymentMode.objects.all())
    return instance

现在要将支付模式保存在商店中,您可以询问用户给定商店的可用支付模式是什么,或者如果您知道所有支付模式都将受支持,那么在保存商店时获取所有支付模式并分配它来存储。

上述方法有一个缺点,如果添加了任何新的支付模式,那么您必须运行一个脚本来添加到所有以前的商店。


推荐阅读