我有两个模型,分别为: 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
所以问题是上述问题中的保存函数重写方法将继承所有外键吗?还是只能做成一个?
显然,将首先创建付款方式。同样在将来,如果添加了付款方式,是否可以自动向所有现有商店添加新的付款方式?
我创建模型的方法可能是错误的。
答案 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)将为您提供特定的模式。