make模式在创建时会继承多个外键

时间:2018-07-20 03:20:03

标签: django django-models

我有两个模型,分别为: PaymentMode 存储为

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问题,可能这是重复的,但是所有这些都覆盖了save函数并仅使一个继承的对象像:

Stackoverflow question

所以问题是上述问题中的保存函数重写方法将继承所有外键吗?还是只能做成一个?
显然,将首先创建付款方式。同样在将来,如果添加了付款方式,是否可以自动向所有现有商店添加新的付款方式?
我创建模型的方法可能是错误的。

2 个答案:

答案 0 :(得分:1)

由于这是多对多关系(一个商店可以有多种付款方式,而一种付款方式可以附加到多个商店)。因此,您应该使用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

现在要在商店中保存付款方式,您可以询问用户给定商店的可用付款方式是什么,或者您是否知道将支持所有付款方式,然后在保存商店时提取所有付款建模并分配给存储。

上述方法将具有一个缺点,即如果添加了任何新的付款方式,则必须运行脚本以将其添加到所有以前的商店中。

答案 1 :(得分:0)

您可以再定义一个模型

class AllPayemntModes(models.Model):
    modes = models.ManyToManyField(PaymentMode) 

然后将所有付款方式添加到商店模型中,并

class Store(models.Model):
    payment_modes = models.ForeignKey(AllPayementModes)

然后,每当添加新商店时,您只需将其添加到 AllPayemntModes ,它将对所有商店可用。 specific_mode = store.payment_modes.modes.get(name =(“ cashcash / debi / credit)将为您提供特定的模式。