Django中的三元模型关联

时间:2018-08-05 23:12:14

标签: python django django-models uml

我已经像这样建模了UML类图

UML Diagram with ternary association

我想将此关联翻译为Django。我有以下内容:

class Crypto(models.Model):
    cryptoName = models.CharField(max_length=64, primary_key=True)

class Worker(models.Model):
    name = models.CharField(max_length=64)
    lastname = models.CharField(max_length=64)
    email = models.EmailField(max_length=128, primary_key=True)
    tlf = models.CharField(max_length=20)

    cryptos = models.ManyToManyField(Crypto)

class Operation(models.Model):
    refNum = models.IntegerField()
    datetime = models.DateTimeField()
    amount = models.FloatField()
    amountCrypto = models.FloatField()

我坚持尝试代表三元关联。 Django具有through的{​​{1}}属性,但是,正如您所看到的,该关联绝不是m2m,而是多对多的。那么用Django模型表示这种三元关联的最佳方法是什么?


编辑:数据库中将注册加密货币,并且工作人员可以执行的操作是使用所需数量的数字(如果需要,可以禁用)。

1 个答案:

答案 0 :(得分:2)

如果您想要一个工人拥有许多加密货币。然后有两个用例将定义您必须使用ManyToManyFieldForeignKey的内容。

如果所有用户的加密货币对象始终彼此不同。

  

例如,如果用户正在注册自己并可以创建   有自己的加密货币,它们总是与现有的不同   货币。

您必须在Crypto模型中添加 ForeignKey ,而不是在Worker模型中使用 ManyToManyField

class Crypto(models.Model):
    cryptoName = models.CharField(max_length=64, primary_key=True)
    worker = models.ForeignKey(Worker, related_name='cryptos')

    def __str__(self):
       return self.cryptoName

从Worker模型中删除加密货币 ManyToManyField 关系

这样,您可以拥有许多与工作人员相关的密码,并且可以使用字段中提到的related_name访问工作人员的密码

worker = Worker.objects.first()
worker.cryptos
# output: <QuerySet [<Crypto: IOT>, <Crypto: BTC>, ...]>

如果用户可以在注册时从已经可用的加密货币中进行选择

  

这意味着多个用户正在与加密的同一对象链接   用户可以选择尽可能多的货币。

您必须像现在使用的那样使用 ManyToManyField

您只需使用

即可访问工人的那些货币对象
worker.cryptos
# output: <QuerySet [<Crypto: IOT>, <Crypto: BTC>, ...]>

要将加密货币链接到工作人员,可以使用.add()

crypto = Crypto.objects.get(cryptoName='BTC')
worker.cryptos.add(crypto)  

更新

创建 ManyToManyField 关系时,将在后台创建一个表,该表保留两个模型的引用,但是如果要创建自己的中间表,则必须使用{{1} }关键字,同时定义 ManyToManyField

through

并将两个模型的外键手动添加到class Worker(models.Model): ... # rest of the fields cryptos = models.ManyToManyField(Crypto, through='Operation', related_name='workers') 模型中。

Operation
  

查看official docs以获得有关如何使用它的更多信息。