【问题标题】:make mode inherit multiple foreign keys on creationmake 模式在创建时继承多个外键
【发布时间】:2018-07-20 03:20:02
【问题描述】:

我有 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 question

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

【问题讨论】:

    标签: django django-models


    【解决方案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
    

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

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

    【讨论】:

    • 如何获取所有支付方式并进行分配?这就是我需要帮助的,我应该通过override保存功能并保存多次吗?
    • 谢谢@Ritesh Agarwal
    • 我试过了,在多对多中我有重复问题,通过管理部分,商店可以多次添加示例付款,我还希望每个商店的关系都是唯一的
    • @AashishGahlawat 如果您使用add 方法保存m2m 关系,那么第二次添加不会创建重复关系。
    【解决方案2】:

    你可以再定义一个模型

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

    然后将所有支付方式添加到 Store 模型和

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

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

    【讨论】:

    • 我可以直接在商店本身使用多对多作为 payment_modes = model.ManyToMany(PaymentMode) 吗?
    • @Aashish Gahlawat 可以,但问题是,无论何时创建商店,您都需要将所有这些方法添加到该字段,并且无论何时创建新的付款方式,您都需要返回并将其添加到所有又是商店
    猜你喜欢
    • 2012-01-18
    • 2012-06-09
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多