多对多的 Django 外键 Table

Django Foreign Key to Many to Many Table

我需要帮助才能正确设置我的模型。假设我有三个模型:

帐户和所有者是多对多的,所以:

class Account(models.Model):
    number = models.CharField(max_length=10)

class Owner(models.Model):
    account = models.ManyToManyField(Account)
    fullName = models.TextField()

那么,一个"AccountOwner"可以进行很多笔交易。所以,如果我和我妻子有同一个账户,我可以为 t 做很多交易,她也可以。

我对交易模型的第一次尝试:

class Transaction(models.Model):
    #Does not work - Could pick account owner is not on
    account = models.ForeignKey(Account)
    owner = models.ForeignKey(Owner)
    title = models.CharField('title', max_length=50)

两个外键不起作用。我需要 account_owner table 上的一个外键。我可以在不创建实际 account_owner 模型的情况下执行此操作吗?

感谢您的宝贵时间

实际上您已经创建了 account_owner 模型。它在代码中是不可见的,但它存在。您可以使其可见并在 M2M 字段中使用 through 参数:

class Owner(models.Model):
    accounts = models.ManyToManyField(Account, through='OwnerAccount')
    fullName = models.TextField()

class OwnerAccount(models.Model):
    owner = models.ForeignKey(Owner)
    account = models.ForeignKey(Account)

class Transaction(models.Model):
    owner_account = models.ForeignKey(OwnerAccount)
    title = models.CharField('title', max_length=50)

您仍然可以像往常一样访问您的 Owner.accounts 多对多字段。那么你将调用 owner.acounts.add(some_account) 相应的 OwnerAccount 实例将自动创建。

我想你可能用错了方法。

交易在帐户级别进行跟踪,因此您不必担心交易 table 中的 "AccountOwner"; "AccountOwner" 部分只是谁被授权使用该帐户,并且该信息在您的应用程序的其他地方使用。

我建议你这样做:

  1. 交易在 "shopping cart/basket" 级别创建,并绑定到一个(或多个,这取决于您是否要允许部分付款)帐户.

  2. 在"shopping cart/basket"级别,可以追踪登录人;然后在结帐页面向他们展示他们拥有的经过过滤的帐户列表;使用 Owner.objects.filter(fullName='John Smith').account_set.all() 之类的查询;在这里您可以跟踪谁发出了交易请求。

  3. 在交易table中,存储以下信息:

    1. 参考购物车项目(从那里,您可以找到所有者)
    2. 用于执行交易的帐户。
    3. 交易总金额。
    4. 购物总金额cart/basket.
    5. 交易状态。

这样,交易 table 保存了与交易相关的信息,而不是您的 "ownership" 信息。明天,如果您决定更改所有者,您只需在一个有意义的地方(在 Owner 模型中)而不是交易模型中进行。