多对多的 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" 部分只是谁被授权使用该帐户,并且该信息在您的应用程序的其他地方使用。
我建议你这样做:
交易在 "shopping cart/basket" 级别创建,并绑定到一个(或多个,这取决于您是否要允许部分付款)帐户.
在"shopping cart/basket"级别,可以追踪登录人;然后在结帐页面向他们展示他们拥有的经过过滤的帐户列表;使用 Owner.objects.filter(fullName='John Smith').account_set.all()
之类的查询;在这里您可以跟踪谁发出了交易请求。
在交易table中,存储以下信息:
- 参考购物车项目(从那里,您可以找到所有者)
- 用于执行交易的帐户。
- 交易总金额。
- 购物总金额cart/basket.
- 交易状态。
这样,交易 table 保存了与交易相关的信息,而不是您的 "ownership" 信息。明天,如果您决定更改所有者,您只需在一个有意义的地方(在 Owner
模型中)而不是交易模型中进行。
我需要帮助才能正确设置我的模型。假设我有三个模型:
- 账户
- 所有者
- 交易
帐户和所有者是多对多的,所以:
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" 部分只是谁被授权使用该帐户,并且该信息在您的应用程序的其他地方使用。
我建议你这样做:
交易在 "shopping cart/basket" 级别创建,并绑定到一个(或多个,这取决于您是否要允许部分付款)帐户.
在"shopping cart/basket"级别,可以追踪登录人;然后在结帐页面向他们展示他们拥有的经过过滤的帐户列表;使用
Owner.objects.filter(fullName='John Smith').account_set.all()
之类的查询;在这里您可以跟踪谁发出了交易请求。在交易table中,存储以下信息:
- 参考购物车项目(从那里,您可以找到所有者)
- 用于执行交易的帐户。
- 交易总金额。
- 购物总金额cart/basket.
- 交易状态。
这样,交易 table 保存了与交易相关的信息,而不是您的 "ownership" 信息。明天,如果您决定更改所有者,您只需在一个有意义的地方(在 Owner
模型中)而不是交易模型中进行。