Django多对多表的外键

时间:2015-01-18 05:21:54

标签: django django-models django-admin

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

  • 帐户
  • 所有者
  • 交易

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

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表上需要一个外键。我可以在不创建实际的account_owner模型的情况下执行此操作吗?

感谢您的时间

2 个答案:

答案 0 :(得分:8)

事实上,您已经创建了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多2字段。那么您将调用owner.acounts.add(some_account)将自动创建相应的OwnerAccount实例。

答案 1 :(得分:0)

我认为你可能会以错误的方式解决这个问题。

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

我建议你这样做:

  1. 交易是在"购物车/购物篮"级别,并且与一个(或许多,取决于您是否要允许部分付款)帐户

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

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

    1. 参考购物车项目(从哪里可以找到所有者)
    2. 用于执行交易的帐户。
    3. 交易总额。
    4. 购物车/购物篮的总金额。
    5. 交易状况。
  4. 这样,交易表中包含与交易相关的信息,并且不会保留您的所有权"信息。明天,如果你决定改变所有者,你只需要在一个有意义的地方(在Owner模型中),而不是交易模型。